2017-10-24 5 views
0

最新のXCTestCase機能で単体テストをするのを待つことに問題があります。UnitTest - NSPredicateで期待待ちを無視しました

は、これは私が

viewModel.getLocations() 
let loaded = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true)) 
let dataLoaded = XCTNSPredicateExpectation(predicate: loaded, object: viewModel.dataExist()) 
wait(for: [dataLoaded], timeout: 5) 

は、だから私は継続して発生するネットワークの負荷を待つ必要があり、それが待機しないものです。しかし、それは常にタイムアウトになります。私のヴァースを調べると、データが設定されます。最後に

テストは私が待っているの結果をキャッチした場合に成功すると、その後も、TIMEDOUT場合進めるが、それだけでハックですが...あなたの助けを

Thxをが

答えて

1

それが最善の方法ですユニットテスト中にネットワーク通話を使用しないでください。これは模擬データを使った依存性注入のためのものです。

私はかつて、この上の話とサンプルコードはここで見つけることができなかった。https://github.com/karnett/MVVM

は、あなたの実際の質問に展開するには - 私は昔スタックオーバーフロー宇宙の周りに浮いたこの2つの関数を使用します。

func wait(_ duration: TimeInterval, object: XCUIElement) 
{ 

    //waits for condition to be met when changing views before continuing tests. 
    _ = self.expectation(
     for: NSPredicate(format: "exists == 1"), 
     evaluatedWith: object, 
     handler: nil) 
    self.waitForExpectations(timeout: duration, handler: nil) 
} 

func wait(_ duration: TimeInterval, object: XCUIElementQuery, count: Int) 
{ 
    //waits for condition to be met when changing views before continuing tests. 
    _ = self.expectation(
     for: NSPredicate(format: "self.count = \(count)"), 
     evaluatedWith: object, 
     handler: nil) 
    self.waitForExpectations(timeout: duration, handler: nil) 
} 

、あなたがでそれらを呼び出すことができます:あなたのビューをx時間によってロードされない場合

let emailTextField = app.textFields["Email"] 

self.wait(2.0, object: app.textFields["Email"]) 

、ユニットテストは失敗するはずです。単体テストは、1)何も破壊しなかった、2)ユーザーの要件を確認する、3)ユーザーが良い経験をしていることを確認するために存在します。

+0

あなたの答えは、Thxです。うん、私は嘲笑について知っています。それは私の残りの視点で行ったことです.Modelクラス。しかし、私はこのテストでこの特定の方法をカバーしたかったのです。私はここで私のビューコントローラをテストしていないので、私はUI要素にアクセスする必要はありません。 varsとオブジェクトが設定されるまでNSPredicateを使用する必要があります。また、waitForExpectationsはXCTWaiter.wait()に置き換えられました。 – Nikolai

関連する問題