1

私は全く新しいテストを行っています。たとえば、View Modelの列挙型(none、dontSeeProvider、showAllProviders)の3つのケースごとにテストを書く方法を例を挙げて説明しておきます。テーブルビューに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) 
} 

} 

私が「なし」の場合のためにテストを書きましたが、把握することができていません他の2つのケース:

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に関してあなたを助けることはできません。私はちょうどあなたの質問からそれについて聞いた。 –

関連する問題