2017-03-20 6 views
0

website에서 도움말 도용, 작은 대기 함수를 실행하기 위해이 수정 프로그램을 구현하여 요소/페이지를 기다릴 수 있도록했습니다. /기타. 테스트를 계속하기 전에로드해야합니다. 수정 작업은 테스트에서 직접 코드를 사용해야하지만 다른 클래스의 유틸리티 메서드에 넣을 때 올바른 통과/실패 결과를 반환하지 않습니다. 다음 코드를 실행할 때UI 테스트 유틸리티 메서드로 어설 션이 실패 (Xcode 8, Swift 3)를 반환하지 않음

문제는 :

func testCreateGame() { 
    let app = LauncherUtilityMethods.startApp() 
    AllStageUtilityMethods().waitForElement(app.buttons["THISDOESNOTEXIST"]) 

가이 요소가 존재하지 않는,하지만 난 여전히 테스트 통과를 볼 수 있습니다. I는, 테스트가 그에 따라 통과/실패는 IF 문에 직접 XCTFail()를 삽입 한 후

func waitForElement(_ element: XCUIElement, file: String = #file, line: UInt = #line) { 
    let exists = NSPredicate(format: "exists == true") 
    expectation(for: exists, evaluatedWith: element, handler: nil) 

    waitForExpectations(timeout: 5) { (error) -> Void in 
     if (error != nil) { 
      let message = "Failed to find \(element) after 5 seconds." 
      self.recordFailure(withDescription: message, inFile: file, atLine: line, expected: true) 
      XCTFail() 
     } 
    } 

: 여기 유틸리티 메소드이다. 이 시나리오를 처리하는 더 좋은 방법이 있습니까? 실제로 테스트를 두 번 이상 실패하는 것은 불필요한 것으로 보이지만 실제로는 하나만 실패로 표시됩니다.

XCTFail에 설명을 추가 할 수는 있지만 실제로는 .recordFailure 옵션과 같이 덜 우아합니다. 도움에 감사드립니다!

답변

2

XCTestCase 자체에서 해당 유틸리티 메소드를 작성하여 실행중인 테스트 케이스의 컨텍스트를 갖도록 제안합니다. 모든 assertion에는 통과 또는 실패 테스트 케이스가 필요합니다. 다음은 샘플 코드입니다.

extension XCTestCase { 

func waitForElementToAppear(element: XCUIElement, timeOut: Double = 5) { 
    let existsPredicate = NSPredicate(format: "exists == true") 
    expectation(for: existsPredicate, 
       evaluatedWith: element, handler: nil) 
    waitForExpectations(timeout: timeOut, handler: nil) 
} 


func waitForElementToDisappear(element: XCUIElement){ 
    let doesNotExistPredicate = NSPredicate(format: "exists == false") 
    expectation(for: doesNotExistPredicate, 
       evaluatedWith: element, handler: nil) 
    self.waitForExpectations(timeout: 50) { error in 
     sleep(1) 
    } 
} 
} 

당신이 아래

testCase.waitForElementToAppear(element: signOutButton) 
+0

호출 할 수있는 꿈을 작동합니다. 고맙습니다! waitForElementToDisappear 코드는 아직 테스트하지 않았지만 코드의 작은 조합을 사용하여 오류 메시지를 얻었습니다 (테스트 자체에서). –

+0

도움이 되셨다고 :) – Shahid