我想在Swift中使用嵌套类来进行模拟。想象一下bar()
类的Foo
方法正在测试中:
class Foo: NSObject {
func baz() -> String {
return "baz"
}
func bar() -> String {
return self.baz().stringByReplacingOccurrencesOfString("z", withString: "r")
}
}
我想模仿baz()
方法,并通过以下测试验证bar()
是否取决于它:
class FooTests: XCTestCase {
func testBar() {
class FooMock: Foo {
override func baz() -> String {
return "zzz"
}
}
let mock = FooMock()
let result = mock.bar()
XCTAssertEqual("rrr", result)
}
}
我已将Foo
类添加到应用程序和测试目标,以绕过测试目标的访问修饰符问题。
应用程序无法编译,错误如下:
Global is external, but doesn't have external or weak linkage!
%4* (%0*, i8*)* @_TToFCFC13TestTestTests8FooTests7testBarFS0_FT_T_L_7FooMock3bazfS1_FT_SS
invalid linkage type for function declaration
%4* (%0*, i8*)* @_TToFCFC13TestTestTests8FooTests7testBarFS0_FT_T_L_7FooMock3bazfS1_FT_SS
LLVM ERROR: Broken module found, compilation aborted!
将FooMock
移动到单独的源文件后,它会编译并正常工作。
当使用嵌套类来模拟iOS标准框架中的任何方法时,它可以正常工作:
func testMockDefaults() {
class NSUserDefaultsMock: NSUserDefaults {
override func objectForKey(defaultName: String) -> AnyObject? {
return "Super secret!"
}
}
let defaults = NSUserDefaultsMock(suiteName: "SuiteName")!
defaults.setObject("Test", forKey: "Test")
let result = defaults.objectForKey("Test") as String
XCTAssertEqual("Super secret!", result)
}
请你解释一下我错过了什么,背后的原因是什么?