swift - 在单元测试中使用扩展更改默认实现

标签 swift unit-testing

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

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 不能覆盖,但这个例子使用了不同的目标。

有什么自然方法可以实现我的想法?

最佳答案

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

在你的情况下,测试目标可以定义另一个协议(protocol)扩展,但只能在你的测试目标中使用,它不会影响你的其他目标,它已经编译并且不知道这个其他扩展。

关于swift - 在单元测试中使用扩展更改默认实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40058336/

相关文章:

swift - 如何在 tvOS 中以编程方式更改焦点

ios - 在导航 Controller 中添加一次公共(public) View

swift - 如何在具有特定高度的 TableView 中加载数据

javascript - Angularjs Jasmine 测试 : Making api call with $backend

arrays - 如何根据 UISwitch 操作更新类中项目的值?

ios - Swift 单元测试从闭包内部抛出函数

ruby - 在 Ruby Test::Unit 中 stub CSV 文件

Angular Testing 路线: SPEC HAS NO EXPECTATIONS should navigate to/tests

unit-testing - 检索 SelectList 项目的数量?

c# - 英孚。模拟 ICollection