使用单元测试中的扩展名更改默认实现

时间:2016-10-15 11:15:28

标签: swift unit-testing

我有一个名为Loggable的简单协议,我想用它在我的应用程序中创建日志条目。协议的默认实现是使用扩展来完成的。我想在我的测试中更改默认实现,以便在测试应用程序时丢弃控制台上的任何日志。

protocol Loggable {
    func log(message: String, level: LogLevel, customAttributes: [String : AnyObject]?, filename: NSString, line: Int, function: String)
}

因此,默认实现类似于:

extension Loggable {
    func log(message: String, level: LogLevel = .Debug, customAttributes: [String : AnyObject]? = nil, filename: NSString = #file, line: Int = #line, function: String = #function) {
        // Log internally
        InternalLog.log(message, level: level, customAttributes: customAttributes, filename: filename, line: line, function: function)
        // Log remotely
        // Fabric, LogEntries ?!
    }
}

在单元测试中我正在做:

extension Loggable {
    func log(message: String, level: LogLevel = .Debug, customAttributes: [String : AnyObject]? = nil, filename: NSString = #file, line: Int = #line, function: String = #function) {
        // Do nothing
    }
}

问题是我运行测试套件时正在打印所有日志。它从不使用单元测试中添加的Loggable扩展名。

我知道 Swift Extensions 无法覆盖,但此示例使用的是不同的目标。

实现我的想法的任何自然方式?

1 个答案:

答案 0 :(得分:0)

协议扩展不使用动态分派,这意味着符合该协议的任何类型将仅使用编译时可用的扩展或其自己的实现(如果实现)。

在您的情况下,测试目标可以定义另一个协议扩展,但仅在您的测试目标中使用,它不会影响您已编译的其他目标,并且不知道此其他扩展