私は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がどのようにセマフォをやっているのか、そして何とかデッドロックを作り出したことを理解していません。誰かがより良い解決策を持っているなら、私はそれを聞いてうれしいです。
私はこのことを保証することができます任意の方法最初にテストが実行されますか?このテストが完了する前に他のテストが実行されるようにすることは、面白いと感じています。 – Mizmor
@Mizmor [XCode 8、no](http://stackoverflow.com/a/39773897/620197)を使用している場合。 –
もっと良い方法があることを望みますが、これは唯一の選択肢です。ありがとう – Mizmor