2017-04-26 36 views
2

我正在通过Alamofire测试API。我需要对服务器进行一次调用,以便为集成测试做好准备。一旦完成,我已准备好开始运行测试。XCTest使用信号量进行单一异步安装

通常override setUp()为每个测试运行,所以我不想这样做。

我因此选择覆盖class setUp()如下所述:https://developer.apple.com/reference/xctest/xctestcase

这一切都很好,但现在,我不再可以使用标准的waitForExpectations。 (在class override setUp())我得到几个编译器错误,告诉我,我不再调用同一waitForExpectations因为我在一个类的方法,而不是一个测试用例。

要尝试解决这个问题,我想用一个信号量像这样:

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

这不起作用引擎盖下,有一个阿拉莫火警电话服务器,并将其与用户响应使用集成测试我确实看到服务器纺纱,所以。我知道实际的沟通正在发生,但我从来没有进入完成关闭。

我怀疑我不明白Swift是如何做信号量的,而且我也不知怎的造成了一个死锁。如果有人有更好的解决方案,我会非常乐意听到它。

回答

1

我得到几个编译器错误,告诉我,我不再打电话 相同waitForExpectations因为我在一个类的方法,而不是一个 测试用例

这是有道理的。你可能想什么是重构,使你在一个测试用例:

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/

+0

任何方式,我可以保证,这测试首先运行?这种感觉很有趣,迫使其他测试依赖于这个测试在他们可以运行之前完成。 – Mizmor

+0

@Mizmor如果您正在使用[XCode 8,否](http://stackoverflow.com/a/39773897/620197)。 –

+0

我希望有更好的办法,但这似乎是唯一的选择。谢谢 – Mizmor