いつもお世話になっております。
非同期処理のAssertについて質問です。
以下みたいな関数をテストするのですが、
swift
1class Target { 2 private(set) var loginId: String 3 private(set) var loginLastDate: Stirng 4 func login(_ completion: ((_ result: String) -> Void)?) { 5 DispatchQueue.global(qos: .default).async { 6 let record = getRecord()//CoreDataからレコードを取得する関数 7 loginId = record.loginId 8 9 loginLastDate = record.lastDate 10 ... 11 completion?(return "success"); 12 } 13 } 14} 15
Assertがうまくいきません。
swift
1 func testLogin() { 2 let exp :XCTestExpectation = self.expectation(description:"login") 3 let target = Target() {(result) in 4 XCTAssertEqual(result, "success")//ここはカバレッジが通っていない 5 } 6 exp.fulfill() 7 self.waitForExpectations(timeout:5, handler: nil) 8 XCTAssertEqual(target.loginId, "testUser")//ここではAssert失敗 9 XCTAssertEqual(target.loginLastDate, "20170521") 10 }
XCTAssertEqual(result, "success")、
XCTAssertEqual(target.loginId, "testUser")のAssertでなぜか失敗してしまいます。
IDについてはlogin()に入れてあるログ出力を見てみるとloginIdに"testUser"が入っていることは分かっているのですが、
Assert時点ではtarget.loginIdは""でなぜか空文字列になっており、失敗する理由が分かりません。
非同期処理のテストの仕方がまずいのか、それとも非同期処理の仕様なのかを教えていただけると幸いです。
よろしくお願いします。
補足:Swift3, Xcode8.3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。