我正在通过Alamoire测试API。我需要对服务器进行一次调用,以便为集成测试做好准备。完成后,我就可以开始运行测试了。
通常的override setUp()
是针对每个测试运行的,所以我不想这样做。
因此,我选择覆盖此处所述的class setUp()
:https://developer.apple.com/reference/xctest/xctestcase
这一切都很好,但现在,我再也不能使用标准的了。(在waitForExpectations
中,我得到几个编译器错误,这些错误告诉我不再调用相同的class override setUp())
,因为我是在类方法中,而不是在测试用例中。
为了解决这个问题,我想使用这样的信号量:
class ServiceLayerTests: XCTestCase {
static var apiService: APIService = APIService()
let sessionManager = SessionManager(serverTrustPolicyManager: ServerTrustPolicyManager(policies: ["http://localhost:3000/": .disableEvaluation]))
static var companyManger: UserWebResource?
static var companyManagerID = -1
override class func setUp() {
apiService.baseURL = "http://localhost:3000/"
beginIntegrationTests()
}
class func beginIntegrationTests() {
var semaphore = DispatchSemaphore(value: 0)
apiService.beginIntegrationTests(completion: {resource, error in
if let resource = resource {
if let manager = resource as? UserWebResource {
companyManger = manager
companyManagerID = manager.id
semaphore.signal()
}
}
})
_ = semaphore.wait(timeout: DispatchTime.distantFuture)
}
}
这不起作用。在引擎盖下,有一个对服务器的alamo fire调用,它与用户响应以用于集成测试。我确实看到服务器在旋转,所以我知道实际的通信正在发生,但我从未进入完成闭包。
我怀疑我不明白信号量有多快,不知何故造成了死锁。如果有人有更好的解决方案,我会非常高兴听到的。
最佳答案
有几个编译器错误告诉我不再调用
因为我在一个类方法中,而不是
测试用例
这是有道理的。您可能想要的是重构以使您处于测试用例中:
override class func setUp() {
apiService.baseURL = "http://localhost:3000/"
}
func testIntegrationTests() {
let urlExpectation = expectation(description: "INTEGRATION TEST")
apiService.beginIntegrationTests(completion: {resource, error in
// ...
urlExpectation.fulfill()
})
// not sure what an acceptable timeout would be, I chose this at random
waitForExpectations(timeout: 25) { error in
if let error = error {
print("Error: \(error.localizedDescription)")
}
}
}
有一些好的测试示例的最佳资源之一可以在这里找到:http://nshipster.com/xctestcase/