如何使用 XCTests 测试打印语句?

问题描述 投票:0回答:3

我正在尝试测试一个函数是否打印出一些东西。我如何使用 XCTests 做到这一点?如果这是可能的,是否有实际理由这样做或不这样做?

谢谢!

ios swift unit-testing tdd xctest
3个回答
6
投票

@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)
}

4
投票

我不知道如何测试

print
语句,但我认为这并不重要。
print
语句的输出与您的应用程序实际执行的操作无关。您应该测试您的应用程序更改了哪些数据、向用户显示的内容等。


0
投票

从侧面来看,如果您必须检查输出,请创建一个应用程序用来控制打印的代理,使其符合协议,然后在测试中模拟它。

举个简单的例子:

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
    }
}

在测试中,您现在可以检查记录的输出与期望。

© www.soinside.com 2019 - 2024. All rights reserved.