<分区>
在抽象类问题的单元测试中,有没有一种方法可以检查控制台的输出是什么?
我正在使用 NUnit 和 Moq。
我的单元测试是这样的:
[Test]
public void QuestionAsk()
{
var mock = new Mock<Question>(new object[]{"question text",true});
mock.CallBase = true;
var Question = mock.Object;
Question.Ask();
mock.Verify(m => m.Ask(), Times.Exactly(1));
}
我在这里检查 Question.Ask() 是否被调用并且它工作正常。 Ask() 不返回值,因此我无法将其分配给变量。该函数只是输出到控制台。
有没有一种方法可以在测试中验证输出==“问题文本”?
编辑:忘了提到问题是一个抽象基类。
我尝试了使用此代码建议的 Concole.Setout 方法:
[Test]
public void QuestionAsk()
{
var mock = new Mock<Question>(new object[]{"question text",true});
mock.CallBase = true;
var Question = mock.Object;
using (var consoleText = new StringWriter())
{
Console.SetOut(consoleText);
Question.Ask();
Assert.That(consoleText.ToString(), Is.StringMatching("question text"));
}
mock.Verify(m => m.Ask(), Times.Exactly(1));
}
但它花费了 236 毫秒,这对于测试来说太长了。实现 IWriter 接口(interface)似乎是处理它的最佳方式,所以我现在就试一试。