2014-06-30 25 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()) 
    } 

} 

然而,当Xcode的TestRunner的尝试运行FooPrimeTests,它不会调用无参数init(),它调用init(invocation: NSInvocation!)(和失败,因为没有一个)。我试图在FooTestHarness覆盖此:

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

FooPrimeTests

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

但这种失败的消息'NSInvocation' is unavailable

是否有解决方法?

+1

我有同样的问题! – Andy

+0

作为一种解决方法,也许你可以尝试嘲笑你的对象。您将能够重定向init调用。 – Pintouch

回答

1

我不OS知道如果我这样做是正确的,但检查你的建议,你应该得到一个编译器错误,如代码: enter image description here

我认为这其实是很正常的,因为你的FooPrimeTests只是继承XCTestCase这已经得到了不同的初始化,如:

init!(invocation: NSInvocation!) 

init!(selector: Selector) 

init() 

也许当你发布你的问题你在一个旧版本的雨燕运行,(我目前运行它在Xcode的测试版6.2)这就是为什么你可以看不到错误。但是,我再说一次,如果我明白了你的观点,你的班级FooPrimeTests就不会看到你自定义的初始值设定项,只是因为正在调整XCTestCase而不是FooTestHarness。哪个是定义init(instance: Foo)的类。

所以你可能想要定义FooPrimeTests作为FooTestHarness的子类。这样你应该能够正确地看到你的初始化器。希望这个帮助。