2017-10-24 1 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) 

그래서 내가 계속 일이 네트워크 로딩을 기다릴 필요가 있고, 그것을 기다리지 않는 것입니다. 하지만 항상 시간을 잰다. 내 vars를 검사 할 때 데이터가 설정되지만. 결국

테스트가 나는 대기의 결과를 잡으면 성공하고도 TIMEDOUT 경우 진행하지만, 그냥 해킹 것입니다 ... 당신의 도움에 대한

들으은

답변

1

그것은에 가장 좋은 방법입니다 단위 테스트 중에는 네트워크 호출을 사용하지 마십시오. 이것은 모의 데이터를 사용한 의존성 주입이 목적입니다.

나는 한번의 이야기와 예제 코드는 여기에서 찾을 수 있습니다 않았다 https://github.com/karnett/MVVM

이 실제 질문에 확장하려면 - 나는 한 번 한 번에 스택 오버플로 우주 주위에 떠 있었다 이러한 두 가지 기능을 사용할 수 :

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

답장을 보내 주셔서 감사합니다! 예, 조롱에 대해 알고 있으며, 나머지는 내보기와 동일합니다. 모델 수업. 그러나이 테스트에서는이 특정 방법을 다루기를 원했습니다. 여기서 뷰 컨트롤러를 테스트하지 않으므로 UI ​​요소에 액세스 할 수 없습니다. vars와 객체가 설정되기를 기다리기 위해 NSPredicate를 사용해야합니다. 또한 waitForExpectations가 XCTWaiter.wait()로 대체되었습니다. – Nikolai

관련 문제