如何在没有返回值的情况下对函数进行单元测试

时间:2017-08-21 08:10:33

标签: swift

我有一个日志系统的包装器,它增加了远程日志记录等功能。

这些函数是class functions,它们不会返回只打印到日志中的值并调用delegate method

我想单元测试每个函数调用正确的委托方法,但方法不返回任何值。有没有办法测试这个?

由于

2 个答案:

答案 0 :(得分:1)

尝试创建Logger协议以实现RealLogger和MockLogger

protocol Logger {
    func log(string: String)
}

class RealLogger: Logger {
    func log(string: String) {
        print(string)
    }
}

class MockLogger: Logger {
    var isLogCalled = false
    var logStringParameter:String? = nil

    func log(string: String) {
        isLogCalled = true
        logStringParameter = string
    }
}

由于你有一个带有类函数的类,你需要有一个静态var引用来在测试时替换它

class MyClass {
    private static var logger: Logger? = RealLogger()

    class func setLogger(logger: Logger) {
        self.logger = logger
    }

    class func logAndCallDelegate() {
        logger?.log(string: "my log message")
        // delegate call
    }
}

更改您的真实记录器并使用模拟进行测试

class MyClassTests: XCTestCase {
    var logger: MockLogger!

    override func setUp() {
        super.setUp()
        logger = MockLogger()
        MyClass.setLogger(logger: logger)

        MyClass.logAndCallDelegate()
    }

    func testLogger() {
        XCTAssertTrue(logger.isLogCalled)
        XCTAssertEqual(logger.logStringParameter, "my log message")
    }

}

您可以应用相同的方法来测试委托调用。

如果您不想在MyClass中实例化RealLogger,您可以使用LoggerLocator对象提供RealLogger,并在测试时更改LoggerLocator中的记录器实现。

答案 1 :(得分:0)

尝试使用

readline()

此外,您可以创建一个假代理来测试回调。