Xcode-为运行和测试操作设置不同的类

时间:2018-08-24 06:16:17

标签: ios xcode

我正在使用iOS应用程序(使用Objective-C和Xcode),并且现在我试图为运行操作和测试操作设置不同的类,到目前为止还无法实现。 假设有一个目标 A 和一个单元测试目标,我们称其为 A_UnitTest A_UnitTest 测试目标 A )。 有一个负责登录过程的类可以叫它 LoginManager ,该类具有方法登录名,该方法负责登录到实际系统。还有一个用于伪造登录的类,其名称与 LoginManager 相同,并且具有相同的界面,并且该类仅用于测试目的。

在运行操作目标 A 期间,已连接真正的 LoginManager 类,并且一切正常,但是在测试操作期间(选择了 A_UnitTest 时) ),然后运行单元测试-我想测试目标 A ,我想使用伪造的 LoginManager 。我可以手动为目标 A 选择伪造的 LoginManager (取消选择真实的 LoginManager ,然后为目标选择伪造的 LoginManager A ),但我想让它自动运行。我的意思是我只想选择目标 A_UnitTest 和测试目标 A ,但是在测试过程中,我想使用伪造的 LoginManager 而不是真实的< strong> LoginManager 。您知道我是否可以在Xcode中做到这一点吗?还是应该在操作前步骤中放一些脚本?

谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我认为您试图实现的目标是不可能的(至少很容易实现)。
您应该做的是以一种可以注入依赖的方式来构造代码,然后可以在测试中使用生产类的模拟版本。

简单的示例(在Swift中,因为没有语言标签):

生产:

CP_OEM

测试:

protocol LoginManagerProtocol {
    func loginWithCredentials(login: String, password: String)
}

class LoginManager: LoginManagerProtocol {

    func loginWithCredentials(login: String, password: String) {
        // perform your production login here
    }
}

class LoginViewModel {
    private let loginManager: LoginManagerProtocol

    init(loginManager: LoginManagerProtocol) {
        self.loginManager = loginManager
    }

    func loginUser(with login: String, password: String) {
        loginManager.loginWithCredentials(login: login, password: password)
    }
}

如果您使用的是Objective-C,则可以使用类似的方法,也可以使用其中一种模拟库(例如OCMock)。

相关问题