我正在尝试测试一个函数是否打印出一些东西。我如何使用 XCTests 做到这一点?如果这是可能的,是否有实际理由这样做或不这样做?
谢谢!
@Mike Taverne 是对的。如果你确实想实际测试 print 语句,你可以像这样扩展 print 函数:
var printWasWrittenTo: Bool = false
public func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
var output: String = items.map { "\($0)" }.joined(separator: separator)
printWasWrittenTo = true //test against this variable being changed
Swift.print(output, terminator: terminator)
}
我不知道如何测试
print
语句,但我认为这并不重要。 print
语句的输出与您的应用程序实际执行的操作无关。您应该测试您的应用程序更改了哪些数据、向用户显示的内容等。
从侧面来看,如果您必须检查输出,请创建一个应用程序用来控制打印的代理,使其符合协议,然后在测试中模拟它。
举个简单的例子:
protocol POutput {
func log(_ string: String)
}
实施:
public class Output: POutput {
func log(_ string: String)
}
通过将其注入作为需要打印的某些函数或对象的依赖项来使用它,您可以注入
Output
的实例,键入为 POutput
例如
func someCLIThing(out: POutput = Output()) {
out.log("print something")
}
// or
init(out: POutput = Output()) {
self.out = out
}
func thatPrints() {
out.log("print something")
}
要测试您创建一个模拟:
class MockOut: POutput {
var logged = ""
func log(_ string: String) {
logged += string
}
}
在测试中,您现在可以检查记录的输出与期望。