对具有构造函数依赖关系的viewController进行单元测试

时间:2020-05-22 09:58:14

标签: swift swift5 ios13.2

我想为下面描述的具有构造函数相关性的viewController编写一个简单的单元测试。不幸的是,参数之一是NSCoder类型的。测试时如何创建NSCoder参数?当我收到此错误消息时。

捕获到“ NSInvalidArgumentException”,“ *** -decodeObjectForKey:仅为抽象类定义。定义-[NSKeyedArchiver encodeObjectForKey:]!”

在线研究:deprecated solution stackoverflow

ViewModel

class ViewModel  {
  private let response: DataResponse
  private var name = "Character name"

  init(reponse: Result) {
      self.reponse = response
  }

  var fullName: String {
    return name
  }

  fund getData() {
     if self.result.name.count > 0 {
         self.name = self.result.name
     }
  }

}

ViewController

class ViewController: UIViewController {
  @IBOutlet weak var name: UILabel!

  private var viewModel: ViewModel

  init?(viewModel: ViewModel, coder: NSCoder) {
      self.viewModel = viewModel
      super.init(coder: coder)
  }

  required init(coder: NSCoder) {
      fatalError("init(coder:) has not been implemented")
  }

  override func viewDidLoad() {
      super.viewDidLoad()
      viewModel.getData()
      characterNameLabel.text = viewModel.fullName
  }
}

显示viewController的方法

@IBSegueAction func showViewController(coder: NSCoder) -> 
ViewController? {

    guard let selectedRow = tableView.indexPathForSelectedRow?.row else {
      return nil
    }
    let singleResult = specialViewModel.results(at: selectedRow)
    let viewModel = ViewModel(result: singleResult)
    return ViewController(viewModel: viewModel, coder: coder)

}

测试用例代码段

class ViewControllerTest: XCTestCase {
  var viewControllerUnderTest: ViewController!
  var viewModel: ViewModel!

  override func setUp() {
      super.setUp()
      let data = PagedResponse.stub().data.results[0]
      self.viewModel = ViewModel(result: data)
      self.viewModel.getData()
      let coder = "??" // how do I create coder
      self.viewControllerUnderTest = ViewControllerUnderTest(viewModel: viewModel, coder: coder)
      self.viewControllerUnderTest.loadView()
      self.viewControllerUnderTest.viewDidLoad()
  }

  override func tearDown() {
      super.tearDown()
  }
}

0 个答案:

没有答案
相关问题