Swift嵌套类作为模拟

时间:2015-03-11 20:18:04

标签: ios swift xctest

我想在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)
}

请你解释一下我错过了什么,背后的原因是什么?

0 个答案:

没有答案