2016-04-29 12 views
3

単体テストしようとしているシンプルなRxSwift Observableシーケンスがあります。RxSwift Unit Testing

このテストは、subscribeNextブロックが常にヒットしないかのように断続的に失敗します。私が間違っていることに関するアイデアは?

編集1

この認証コールは、単に静的なJSONデータを返すと、実際にネットワークを打つされていません。

答えて

8

あなたの問題は、これら二つの問題のいずれかに最も可能性が高いです。

  1. テストは
  2. テストは、同期の方法で書かれているネットワークを打つが、テスト動作は非同期です。
  3. あなたのテストでネットワークを打つについて

あなたが統合テストを行っていない限り、これは、一般的に悪い考えです。ネットワークは信頼性が低く、タイムアウトまたは失敗する可能性があります。あなたのテストでネットワークを打つことがなぜ良い考えでないかについての詳細な情報を見つけることができますhere。非同期テストについて

:何が起こっているが、あなたのアサーションが次のイベントが観測によって送信される前にテストによって実行されていることです。

あなたはこのようなあなたのテストを書き換えることができます:

LETサービス= SomeService()

let expectation = expectationWithDescription("subscribeNext called") 

_ = service!.authenticate().subscribeNext { res in 
    XCTAssert(res.tokenValue == "abc123") 
    expectation.fulfill() 
} 

waitForExpectationsWithTimeout(1) { error in 
    if let error = error { 
    XCTFail("waitForExpectationsWithTimeout errored: \(error)") 
    } 
} 

あなたは、非同期テストhereの詳細情報を見つけることができます。

+0

返信いただきありがとうございます。実際のネットワーク通話がないように模擬データを扱うことに言及するのを忘れていました。私はちょうどそのwaitForExpectationのアプローチを試みたが、時には全くヒットしないように見えます。私は見続けるだろう。再度、感謝します。 – dloomb