コード構造を単純化すると、UIViewController
とviewDidLoad()
があり、DispatchQueue.main.async()
を使用するメソッドを呼び出して、メインスレッドがコードを実行するまで待機します。このテストは堅牢ですか?ユニットテストでDispatchQueue.main.async()を使用できますか?
viewDidLoad() {
method()
}
method() {
...
DispatchQueue.main.async() {
...some code...
}
}
私のテストでは、XCTAssertEqualを呼び出す前にメインスレッドを待つ必要があります。
func testSuccessRequest() {
let exp = expectation(description: "labelText")
let vc = ViewController.init()
vc.request = SuccessRequest.init()
vc.loadViewIfNeeded()
DispatchQueue.main.async() {
XCTAssertEqual(vc.label.text, "success")
exp.fulfill()
}
waitForExpectations(timeout: 40, handler: nil)
}
このテストは堅牢ですか?または、アサーションコードが非同期の前に呼び出される状況がありますか?あなたは右vc.loadViewIfNeeded(後
DispatchQueue.main.async() {
XCTAssertEqual(vc.label.text, "success")
exp.fulfill()
}
を呼び出す場合の方法以来
こんにちは、2秒の遅延を使用しています。しかし、ほんとうの回避策ではありませんか?ランダム遅延値を設定するだけでテストを遅らせる必要はありません。 – aneuryzm
ありがとうございます。あなたのソリューションは機能していて、非同期スレッドを扱っているときに定期的に使用できるように思えます。私は思っていた:どのように共通の問題ですか?あなたはそれについて少し考えなければならなかったようです。しかし、UILabelが非同期に更新されることはあまり一般的ではありませんか?言い換えれば、あなたが私に与えた解決策はどれほど共通点ですか? – aneuryzm
これはコールバックを返さないGCD関数またはKVOの一般的な問題です。これらは有用なシナリオです。私は本当に私の前で改善しなければなりませんでした。私たちは故意に遅れています。 – manismku