gpt4 book ai didi

ios - 在 Swift 中模拟单例进行单元测试时遇到问题

转载 作者:搜寻专家 更新时间:2023-10-31 21:49:26 26 4
gpt4 key购买 nike

你好,我正在尝试模拟我用来测试各种 View Controller 实际上正确调用它的方法的单例之一。

我声明了单例

public class ModelsManager {
static let sharedInstance = ModelsManager()
private init() {}

[...]
}

在使用单例的 View Controller 中,它被设置为惰性计算属性:

class MyViewController: UIViewController {
lazy var Models = {
return ModelsManager.sharedInstance
}()

[...]
}

我正试图在我的 XCTestCase 中模拟 ModelsManager 单例:

[...]

func testSomething() {
let vc = MyViewController(nibName: "MyView", bundle: nil)
var mockModelsManager = ModelsManagerMock.sharedInstance
vc.Models = mockModelsManager

[... do something that calls a function in ModelsManager...]

expect(mockModelsManager.flag) == true // Using Nimble here
}

class ModelsManagerMock: ModelsManager {
var flag = false

override func test() {
flag = true
}
}

expect() 断言中,我得到了 Value of type 'ModelsManager' has no member 'flag'

我在这里错过了什么?

编辑看来我缺少的是 ModelsManagerMock.sharedInstance 仍然从父类(super class)返回 IRModelsManager()。由于 static 不能被子类覆盖,我该如何解决这个问题?

最佳答案

正确的解决方案必须涉及不对单例进行子类化。使用私有(private) init 方法创建单例禁止您继承此方法。

如果目标是测试单例的当前功能,为什么要向它添加额外的功能?单例的关键点是永远应该只有一个。如果你想支持多个,你不应该把它做成单例,即使它只是为了测试。

关于ios - 在 Swift 中模拟单例进行单元测试时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34293584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com