2017-04-26 73 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