我正在使用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中做到这一点吗?还是应该在操作前步骤中放一些脚本?
谢谢您的帮助!
答案 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)。