以下に説明する、コンストラクターに依存するviewControllerの簡単な単体テストを書きたいと思います。残念ながら、パラメーターの 1 つは NSCoder 型です。テスト中に NSCoder 引数を作成するにはどうすればよいですか? このエラーメッセージが表示されます。
「NSInvalidArgumentException」、「*** -decodeObjectForKey: 抽象クラスに対してのみ定義されています。定義 -[NSKeyedArchiver decodeObjectForKey:]!」
オンライン調査:非推奨のソリューション stackoverflow
ビューモデル
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()
}
}