2014-06-30 5 views
8

Swift에서 재사용 가능한 테스트 하네스를 만들려고합니다. 서브 클래스가 테스트 하네스를 확장하여 테스트중인 인스턴스를 제공하고 자체 하위 클래스 별 테스트를 추가 할 수 있다는 아이디어가 있습니다. 방법이 같은 :Swift : NSInvocation을 사용하는 이니셜 라이저 재정의

그러나
class FooTestHarness: XCTestCase { 
    let instance: Foo 

    init(instance: Foo) { 
    self.instance = instance 
    } 

    func testFooBehavior() { 
    XCTAssert(instance.doesFoo()) 
    } 
} 

class FooPrime: Foo { 
    func doesFooPrime(): Bool { /* ... */ } 
} 

class FooPrimeTests: XCTestCase { 

    init() { 
    super.init(FooPrime()) 
    } 

    func myInstance(): FooPrime { 
    return instance as FooPrime 
    } 

    func testFooPrimeBehavior() { 
    XCTAssert(myInstance().doesFooPrime()) 
    } 

} 

, 엑스 코드의의 TestRunner가 FooPrimeTests을 실행하려고 할 때, 그것은 인수 없음 init()를 호출하지 않습니다, 그것은 init(invocation: NSInvocation!)를 호출 (한이 없기 때문에 실패).

init(invocation: NSInvocation!, instance: Foo) { 
    self.instance = instance 
    super.init(invocation) 
    } 

FooPrimeTests에 : 나는 FooTestHarness이를 무시하려

init(invocation: NSInvocation!) { 
    super.init(invocation, FooPrime()) 
    } 

을하지만이 메시지 'NSInvocation' is unavailable와 함께 실패합니다.

해결 방법이 있습니까?

+1

동일한 문제가 있습니다. – Andy

+0

임시 해결책으로 어쩌면 객체를 조롱 해 볼 수 있습니다. init 호출을 재전송 할 수 있습니다. – Pintouch

답변

1

내가 바로 그것을 가지고 확실 OS,하지만 당신은 당신이 같은 컴파일러 오류 받아야 제안 된 코드를 확인하고 있지 않다 : 나는 이해 할수 실제로 enter image description here

은 아주 정상입니다 귀하의 FooPrimeTests 단지 XCTestCase를 하위 클래스이기 때문에 당신은 당신이 스위프트의 이전 버전에서 실행중인 당신이있는 거 질문을, (I 현재 엑스 코드 베타 6.2을 실행하는거야) 왜 당신이 할 수 있다는 게시 아마

init!(invocation: NSInvocation!) 

init!(selector: Selector) 

init() 

: 이는 같은 다른 초기화를 가지고있다 오류가 표시되지 않습니다. 하지만 당신의 요지가 있다면 다시 말하겠습니다. FooPrimeTests 클래스는 FooTestHarness가 아니라 XCTestCase를 서브 클래 싱하기 때문에 사용자 정의 이니셜 라이저를 볼 수 없습니다. init(instance: Foo)이 정의 된 클래스는 다음과 같습니다.

그래서 FooPrimeTests를 FooTestHarness의 하위 클래스로 정의하고 싶을 수도 있습니다. 그렇게하면 이니셜 라이저를 올바르게 볼 수 있습니다. 희망이 도움이됩니다.