【发布时间】:2014-01-02 22:06:47
【问题描述】:
有没有办法在我的抽象类问题的单元测试中检查控制台的输出?
我正在使用 NUnit 和起订量。
我的单元测试如下所示:
[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 text" ?
编辑:忘了提 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 接口似乎是处理它的最佳方式,所以我现在就尝试一下。
【问题讨论】:
-
除了@Keith 的链接,您实际上并不想从您的问题“业务对象”中调用控制台。执行输出是运行程序的任务,因为您现在不能将此类重用于 Web 应用程序。如果只是让它返回字符串,调用程序可以决定如何输出它。
-
@CodeCaster 好点。我最终将把它移植到网络上,所以我应该尽快解决这个问题。我正在做这个项目来学习 C#。我非常感谢您的建议。
标签: c# unit-testing testing nunit moq