Ios Swift测试:控制moc api客户端行为
我正在为我的项目编写测试,并声明了一个远程API客户端协议:Ios Swift测试:控制moc api客户端行为,ios,swift,testing,mocking,Ios,Swift,Testing,Mocking,我正在为我的项目编写测试,并声明了一个远程API客户端协议: public protocol ApiClient { func load(completion: @escaping ([Any]?, String?)) } 并定义了一个moc api客户端,该客户端确认为ApiClient: class MocApiClient: ApiClient { func loadFlights(completion: @escaping ([Any]?, String?)) {
public protocol ApiClient {
func load(completion: @escaping ([Any]?, String?))
}
并定义了一个moc api客户端,该客户端确认为ApiClient
:
class MocApiClient: ApiClient {
func loadFlights(completion: @escaping ([Any]?, String?)) {
// Load a sample JSON file and return it as response
}
}
class MocApiClient: ApiClient {
var path: TestPath = .success
func load(completion: @escaping ([Any]?, String?) -> Void) {
switch path {
case .success:
completion([...], nil)
case .failure:
completion(nil, "error message")
}
}
}
这样,我可以通过加载JSON
文件来返回响应。这是测试的快乐之路。之后,我开始考虑测试不同的可能响应类型,并决定我应该能够改变MocApiClient
的行为,并定义如下:
enum TestPath {
case success
case failure
}
并将其与MocApiClient
一起使用:
class MocApiClient: ApiClient {
func loadFlights(completion: @escaping ([Any]?, String?)) {
// Load a sample JSON file and return it as response
}
}
class MocApiClient: ApiClient {
var path: TestPath = .success
func load(completion: @escaping ([Any]?, String?) -> Void) {
switch path {
case .success:
completion([...], nil)
case .failure:
completion(nil, "error message")
}
}
}
你认为这是个好办法吗?
你有更好的方法吗?如果你只有几个简单的测试,你的方法看起来很好。 但是,如果您有一个相对复杂的逻辑,并且需要测试许多积极和消极的路径,那么您的解决方案的替代方案是创建几个不同的模拟对象,每个对象都有一个目的 这样,您将避免大规模的通用模拟对象问题,并且能够在使用模拟对象的测试方法中定义模拟对象,从而使测试更加集中和独立 大概是这样的:
func testSuccessfulResponse() {
class MockApiClientSuccessfulResponse: ApiClient {
...
}
...
}
func testMalformedResponse() {
class MockApiClientMalformedResponse: ApiClient {
...
}
...
}
func testInconsistentData() {
class MockApiClientInconsistentData: ApiClient {
...
}
...
}
希望这有助于和快乐的单元测试 我也曾考虑过这种做法。谢谢