2017-06-21 5 views
0

ここから例を再作成しました:http://www.mokacoding.com/blog/testing-callbacks-in-swift-with-xctest/waitForExpectations()でタイムアウトしたときに失敗したテストをトリガする方法は?

waitForExpectations()を使用してタイムアウトをテストします。これは、タイムアウトした長期実行プロセスを模倣する必要があります。これを行うには、呼び出された関数のsleep()コマンドのタイムアウト値がwaitForExpectations()に設定されています。

ただし、sleep()は効果がありません。テストは常にパスします。私はをcompletion(true)の前に入れてみましたが、それは結果(つまり、合格したテスト)を変更しません。

タイムアウト時にテストの失敗を引き起こすために実行していることは何ですか?テストクラスで

class SomeService { 
    func doSomethingAsync(completion: (_ success: Bool) ->()) { 
     completion(true) 
     sleep(5) 
    } 
} 

あなたは sleepcompletionを呼び出しているので、あなたの期待はほとんどすぐに満たされているので、あなたのテストに合格し
let service = SomeService() 
service.doSomethingAsync { (success) in 
    XCTAssertTrue(success, "assert is true") 
    expect.fulfill() 
} 

waitForExpectations(timeout: 3) { (error) in 
    if let error = error { 
     XCTFail("timeout errored: \(error)") 
    } 
} 

答えて

1

- あなたは5秒待つ前に。完了ブロックは非同期に実行されますが、1秒未満で終了する可能性があります。

sleepcompletionの内部に呼び出すと、テストは期待通りに失敗します。ただし、expect.fulfill()が呼び出されたときにテストが実行されなくなった場合、テストが失敗するとすぐにクリーンアップされる可能性があるため、expectは実行されなくなる可能性があるため、テストがクラッシュすることがあります(約2秒前達成される)。

class SomeService { 
    func doSomethingAsync(completion: (_ success: Bool) ->()) { 
     DispatchQueue.main.async { 
      completion(true) 
     } 
    } 
} 

テスト:

let service = SomeService() 
service.doSomethingAsync { (success) in 
    XCTAssertTrue(success, "assert is true") 
    sleep(5) 
    expect.fulfill() 
} 

waitForExpectations(timeout: 3) { (error) in 
    if let error = error { 
     XCTFail("timeout errored: \(error)") 
    } 
} 
+0

'completion'は効果がありません()' 'の前に睡眠を入れて、すでに述べたように。 – 4thSpace

+0

はい、申し訳ありませんが、正しい答えに言い直しました。doSomethingAsyncではなく非同期補完ブロックからスリープを呼び出す必要があります。これは同期であり、テストが待機する前にスリープが既に実行されているためです。 – Oletha

+0

'sleep()'が 'completion'で呼び出されるように、上記のコードをどのようにコード化しますか? – 4thSpace

関連する問題