2017-05-16 10 views
1

저는 완전히 새로운 테스팅이었고,보기 모델의 열거 형 (none, dontSeeProvider, showAllProviders)에서 세 가지 경우 각각에 대한 테스트를 작성하는 방법을 예를 들어 설명했습니다.테이블 뷰에 12 개 이상의 항목이있을 때 UIbutton "Show all Providers"가 표시되도록 테스트를 작성하려면 어떻게해야합니까?

enum ProvidersButtonType { 
case none, dontSeeProvider, showAllProviders 
} 

나는 경우 "showAllProviders"와 "dontSeeProviders"에 대한 테스트를 작성하는 방법을 알아낼 수 없었다.

import RxSwift 
import RxCocoa 

struct TopProvidersPickerItem { 
let provider: MVPD 

let logoImage: Observable<UIImage> 

init(provider: MVPD, imageLoader: DecodableProviding) { 
    self.init(provider: provider, logoImage: imageLoader.image(fromURL: provider.logoUrl)) 
} 

init(provider: MVPD, logoImage: Observable<UIImage>) { 
    self.provider = provider 
    self.logoImage = logoImage.catchErrorJustReturn(UIImage()) 
} 
} 

enum ProvidersButtonType { 
case none, dontSeeProvider, showAllProviders 
} 

struct TopProvidersPickerViewModel { 
var caption: String { 
    return "Get access to more full episodes by signing in with your TV Provider" 
} 

let buttonType = Variable<ProvidersButtonType>(.none) 
let items: Observable<[TopProvidersPickerItem]> 
let selectedItem: PublishSubject<TopProvidersPickerItem> = PublishSubject() 
let showAllProvidersTrigger: PublishSubject<Void> = PublishSubject() 
let mvpdPicked: Observable<MVPD> 

init(topProviders: Observable<[MVPD]>, imageLoader: DecodableProviding) { 
    let items = topProviders.map({ mvpds in 
     return mvpds.map { mvpd in 
      TopProvidersPickerItem(provider: mvpd, imageLoader: imageLoader) 
     } 
    }) 
    self.init(items: items) 
} 

init(items: Observable<[TopProvidersPickerItem]>) { 
    self.items = items 
    mvpdPicked = selectedItem.map { $0.provider } 
    let buttonType = items.map { (array) -> ProvidersButtonType in 
     if array.count > 12 { 
      return .showAllProviders 
     } else { 
      return .dontSeeProvider 
     } 
    } 
    buttonType.bind(to: self.buttonType) 
} 

} 

이보기 컨트롤러 :

은보기 모델이다 나는 "없음"사건에 대한 테스트를 썼다, 그러나 알아낼 수 없었다
import UIKit 
import RxCocoa 
import RxSwift 

public class ProviderCollectionViewCell: UICollectionViewCell { 
    @IBOutlet public private(set) weak var imageView: UIImageView! 
} 

public class TopProvidersPickerViewController: UIViewController, 
ViewModelHolder { 
var viewModel: TopProvidersPickerViewModel! = nil 
private let bag = DisposeBag() 

@IBOutlet public private(set) weak var collectionView: UICollectionView! 
@IBOutlet public private(set) weak var captionLabel: UILabel! 
@IBOutlet weak var viewAllProvidersButton: UIButton! 

override public func viewDidLoad() { 
    super.viewDidLoad() 
    captionLabel.text = viewModel.caption 
    setupRx() 
} 

private func setupRx() { 
    viewModel.buttonType.asObservable().subscribe(onNext: { [button = self.viewAllProvidersButton] type in 
     button?.isHidden = false 

     switch type { 
     case .none: 
      button?.isHidden = true 
     case .dontSeeProvider: 
      button?.setTitle("Don't see provider", for: .normal) 
     case .showAllProviders: 
      button?.setTitle("Show all providers", for: .normal) 
     } 
     }) 
     .disposed(by: bag) 

    viewModel.items 
     .bind(to: collectionView 
     .rx 
     .items(cellIdentifier: "ProviderCell", cellType: ProviderCollectionViewCell.self)) { [ unowned self ] _, item, cell in 
      item.logoImage.bind(to: cell.imageView.rx.image).addDisposableTo(self.bag) 
     } 
     .addDisposableTo(bag) 

    collectionView 
     .rx 
     .modelSelected(TopProvidersPickerItem.self) 
     .bind(to: self.viewModel.selectedItem) 
     .addDisposableTo(bag) 

    viewAllProvidersButton 
     .rx 
     .tap 
     .bind(to: self.viewModel.showAllProvidersTrigger) 
     .addDisposableTo(bag) 
} 

} 

다른 두 경우 :

import FBSnapshotTestCase 
import OHHTTPStubs 
import RxSwift 
@testable import AuthSuite 

class TopProvidersPickerViewControllerTests: FBSnapshotTestCase, 
ProvidersViewControllerTests { 

override func setUp() { 
    super.setUp() 
    recordMode = true 
} 

func testDoesNotShowButtonWhenLoadingProviders() { 
    let viewModel = TopProvidersPickerViewModel(items: .never()) 
    let controller = TopProvidersPickerViewController.instantiateViewController(with: viewModel) 
    presentViewController(controller) 

    FBSnapshotVerifyView(controller.view) 
} 

답변

0

나는 FB Snapshot Tester를 한번도 사용하지 않았습니다. 나는 그것을 조사해야 할 것입니다. 여기

내가 그것을 할 것입니다 방법은 다음과 같습니다

나는의 ViewController에 열거를 노출하지 않을 것입니다. setupRx는() 대신이 포함됩니다 :

다음
private func setupRx() { 

    viewModel.buttonTitle 
     .bind(to: viewAllProvidersButton.rx.title(for: .normal)) 
     .disposed(by: bag) 

    viewModel.buttonHidden 
     .bind(to: viewAllProvidersButton.rx.isHidden) 
     .disposed(by: bag) 

    // everything else  
} 

버튼의 제목을 테스트하기 위해, 예를 들어, 내가이 시험을 사용 : 도움을 너무 많이

import XCTest 
import RxSwift 
@testable import RxPlayground 

class TopProvidersPickerViewModelTests: XCTestCase { 

    func testButtonTitleEmptyItems() { 
     let topProviders = Observable<[MVPD]>.just([]) 
     let decodableProviding = MockDecodableProviding() 

     let viewModel = TopProvidersPickerViewModel(topProviders: topProviders, imageLoader: decodableProviding) 

     var title: String = "" 
     _ = viewModel.buttonTitle.subscribe(onNext: { title = $0 }) 

     XCTAssertEqual(title, "Don't see provider") 
    } 

    func testButtonTitle12Items() { 
     let topProviders = Observable<[MVPD]>.just(Array(repeating: MVPD(), count: 12)) 
     let decodableProviding = MockDecodableProviding() 

     let viewModel = TopProvidersPickerViewModel(topProviders: topProviders, imageLoader: decodableProviding) 

     var title: String = "" 
     _ = viewModel.buttonTitle.subscribe(onNext: { title = $0 }) 

     XCTAssertEqual(title, "Don't see provider") 
    } 

    func testButtonTitle13Items() { 
     let topProviders = Observable<[MVPD]>.just(Array(repeating: MVPD(), count: 13)) 
     let decodableProviding = MockDecodableProviding() 

     let viewModel = TopProvidersPickerViewModel(topProviders: topProviders, imageLoader: decodableProviding) 

     var title: String = "" 
     _ = viewModel.buttonTitle.subscribe(onNext: { title = $0 }) 

     XCTAssertEqual(title, "Show all providers") 
    } 
} 


class MockDecodableProviding: DecodableProviding { 
    // nothing needed for these tests. 
} 
+0

감사합니다, 정말 감사를! 나는 setupRx() atm을 변경할 수 없다.) 우리는 테스트를 어떻게 작동 시키는가? – VeeArr

+0

XCTest 대신 FBSnapshotTestCase도 사용해야합니다. – VeeArr

+0

테스트 작성의 전체 요점은 테스트 할 코드를 변경할 수 있기 때문입니다. 즉, 나는 FBSnapshotTestCase에 관해 당신을 도울 수 없다고 말했다. 나는 그저 당신의 질문에 대해 들었습니다. –