2017-04-26 15 views
2

私はAlamofireを通じてAPIのテストを行っています。統合テストの準備にサーバーを一回呼び出す必要があります。それが完了したら、私はテストを実行する準備が整いました。セマフォを使用したXCTestの単一非同期セットアップ

いつものがテストごとに実行されるので、私はそれをしたくありません。ここで説明するように

私はそのため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、no](http://stackoverflow.com/a/39773897/620197)を使用している場合。 –

+0

もっと良い方法があることを望みますが、これは唯一の選択肢です。ありがとう – Mizmor

関連する問題