Ios Swift嵌套类作为mock
我想在Swift中使用嵌套类进行模拟。想象一下下面的Ios Swift嵌套类作为mock,ios,swift,xctest,Ios,Swift,Xctest,我想在Swift中使用嵌套类进行模拟。想象一下下面的Foo类的bar()方法正在测试中: class Foo: NSObject { func baz() -> String { return "baz" } func bar() -> String { return self.baz().stringByReplacingOccurrencesOfString("z", withString: "r") } } 我
Foo
类的bar()
方法正在测试中:
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)
}
你能解释一下我错过了什么,这背后的原因是什么吗