gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:32:38 25 4
gpt4 key购买 nike

我正在开发 iOS 应用程序(使用 Objective-C 和 Xcode),目前我正在尝试为运行操作和测试操作设置不同的类,但目前无法实现。假设有目标 A 和单元测试目标,我们称之为 A_UnitTest(A_UnitTest 测试目标 A ).有一个负责登录过程的类,我们称之为 LoginManager,它有方法 login,这个方法负责登录到真实系统。还有一个与 LoginManager 具有相同名称和相同接口(interface)的假登录类,它应该仅用于测试目的。

在运行 Action 目标期间 a 具有Real loginmanager 连接的类,并且所有操作都很好,但是在测试过程中(选择 a_unittest 时) 然后我运行单元测试 - 我想测试目标 A 我想使用假的 LoginManager。我可以为目标 A 手动选择假的 LoginManager(取消选择真实的 LoginManager 并为目标 选择假的 LoginManager A),但我想让它自动工作。我的意思是我只想选择目标 A_UnitTest 和测试目标 A,但在测试期间我想使用假的 LoginManager 而不是真正的 < strong>登录管理器。你知道我是否可以在 Xcode 中以某种方式做到这一点吗?或者我应该在行动前步骤中放置一些脚本吗?

谢谢你的帮助!

最佳答案

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

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

制作:

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)
}
}

测试:

class LoginManagerMock: LoginManagerProtocol {

var mock_loginWithCredentials: ((String, String) -> Void)?
func loginWithCredentials(login: String, password: String) {
mock_loginWithCredentials?(login, password)
}
}

class LoginViewModelTests: XCTest {

func test_loginUser_shouldPassCredentials_toLoginManager() {
// Arrange
let sampleLogin = "login"
let samplePassword = "password"

let loginManagerMock = LoginManagerMock()
var capturedCredentials: (login: String, password: String)?

loginManagerMock.mock_loginWithCredentials = { login, password in
capturedCredentials = (login, password)
}

// Act
let sut = LoginViewModel(loginManager: loginManagerMock)
sut.loginUser(with: sampleLogin, password: samplePassword)

// Assert
XCTAssertEqual(sampleLogin, capturedCredentials.login)
XCTAssertEqual(samplePassword, capturedCredentials.password)
}
}

如果您使用的是 Objective-C,可以使用类似的方法,或者您可以使用模拟库之一(例如 OCMock)。

关于ios - Xcode - 为运行和测试操作设置不同的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51998532/

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