首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当表视图中有超过12个项目时,我该如何编写测试以确保UIbutton“显示所有提供程序”出现?

当表视图中有超过12个项目时,我该如何编写测试以确保UIbutton“显示所有提供程序”出现?
EN

Stack Overflow用户
提问于 2017-05-17 03:21:02
回答 1查看 189关注 0票数 2

因此,我对测试完全陌生,我只是需要一些帮助,例如,我将如何为视图模型枚举中的三种情况(无、dontSeeProvider、showAllProviders)中的每一种情况编写测试。

代码语言:javascript
复制
enum ProvidersButtonType {
case none, dontSeeProvider, showAllProviders
}

我还不知道如何为"showAllProviders“和"dontSeeProviders”编写测试。

这是视图模型:

代码语言:javascript
复制
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)
}

}

这是视图控制器:

代码语言:javascript
复制
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)
}

}

我为“无”的情况写了一个测试,但还没能弄清楚其他两种情况:

代码语言:javascript
复制
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)
}
EN

回答 1

Stack Overflow用户

发布于 2017-05-17 09:47:35

我从未使用过FB Snapshot Tester。我得去查一查。

下面是我会怎么做:

我不会将枚举暴露给ViewController。setupRx()将包含以下内容:

代码语言:javascript
复制
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      
}

然后,为了测试按钮的标题,例如,我将使用以下测试:

代码语言:javascript
复制
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.
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44009887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档