我有一个名为 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/