Ios Swift测试:控制moc 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?)) {

我正在为我的项目编写测试,并声明了一个远程API客户端协议:

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 {
        ...
    }
    ...
}

希望这有助于和快乐的单元测试

我也曾考虑过这种做法。谢谢