在MVVM环境中使用Xcode为视图模型生成代码覆盖率时,我遇到了一个问题。
我们的基本设置是视图控制器向视图模型发出请求,而视图模型又调用与web服务对话的数据管理器上的方法。
我想出了一种相当优雅的方法来测试视图模型,方法是创建一个假的数据管理器,该管理器对实际的数据管理器进行子类,并重写VM调用的函数。
问题在于,要使这一工作正常进行,VM必须是应用程序目标和测试目标的一部分。这的一个明显的副作用是,即使单元测试通过,也不会为属于两个或多个目标的项生成代码覆盖。在项目中启用了代码覆盖率。
下面是一个摘录的视图模型:
import Foundation
class BoosViewModel: BaseViewModel {
convenience override init() {
self.init(dataManager: BoosDataManager(), andModel: nil)
}
func getUnlinkedBoos(_ cardType: CardType) {
(dataManager as! BoosDataManager).getUnlinkedBoos(cardType) { result, error in
...stuff happens here...
}
}
}..。和数据管理器
class BoosDataManager: DataManager {
static let SharedInstance: BoosDataManager = {
var manager = BoosDataManager()
return manager
}()
func getUnlinkedBoos(_ cardType: CardType = .loyalty, completion: @escaping ((_ result: BoosModel?, _ error: NSError?) -> Void)) {
...stuff happens here...
}
}...and试验
class BoosViewModelTests: XCTestCase {
func testGetUnlinkedBoosHappyPath() {
class FauxDataManager: BoosDataManager {
override func getUnlinkedBoos(_ cardType: CardType = .loyalty, completion: @escaping ((_ result: BoosModel?, _ error: NSError?) -> Void)) {
...stuff happens here...
}
}
let viewModel = BoosViewModel()
let dataManager = FauxDataManager()
viewModel.dataManager = dataManager
viewModel.getUnlinkedBoos(.loyalty)
XCTAssertTrue(testObserver.updated)
XCTAssertEqual(testObserver.newViewModel.getBoos().count, 1)
}
}正如我前面提到的,这个场景中的单元测试成功地完成了,但是没有生成单元覆盖。
我有一些旧的测试,实际上我创建了一个外部的假数据管理器类,这个类是被测试使用的,被测试的类不是测试目标的一部分,并且覆盖范围很好。
这样做的缺点是,我必须创建多个数据管理器来处理其返回的特定情况。如果我不能封装这些类,我需要创建一组快速的数据管理器,每个场景都有一个。
这就是我想出内部课程的原因。
现在,如果我从测试目标中删除正在测试的视图模型,问题就出现了。完成此操作后,我将@testable导入BoosApp添加到单元测试中,以便能够解析测试中的视图模型。当我这样做时,我会得到以下错误:
'BoosTests.BoosViewModelTests.(testGetUnlinkedBoosHappyPath () -> ().(FauxDataManager #1)‘(0x11f673d18)到“Boos.BoosDataManager”(0x10444b128)类型的值无法转换。8月30日20:43:01 'BoosTests.BoosViewModelTests.(testGetUnlinkedBoosHappyPath () -> ().(FauxDataManager #1)‘(0x11f673d18)到'Boos.BoosDataManager’(0x10444b128)不能转换值。
我不知道我错过了什么。是否有办法使此场景工作,还是我被困在测试代码之外创建多个数据管理器?
发布于 2017-09-19 16:36:28
最后,我发现主要的问题是视图模型和数据管理器以某种方式被添加到测试目标中。在将它们从测试目标中移除之后,我能够做一些小的更改,并且一切都很好。仅供参考。
https://stackoverflow.com/questions/45971682
复制相似问题