有没有办法在我的抽象类Question的单元测试中检查控制台的输出?
我正在使用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()不返回任何值,因此我无法将其赋值给变量。该函数只是输出到控制台。
有没有办法在测试中验证输出是否等于“问题文本”?
编辑:忘记提到Question是一个抽象基类。
我尝试了建议使用的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接口似乎是处理它的最佳方法,所以我现在会尝试一下。