c# - 在单元测试中检查控制台输出

标签 c# unit-testing testing nunit moq

<分区>

在抽象类问题的单元测试中,有没有一种方法可以检查控制台的输出是什么?

我正在使用 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)似乎是处理它的最佳方式,所以我现在就试一试。

最佳答案

您可以使用自定义输出编写器初始化Question,然后模拟编写器以验证输出:

public interface IOutputWriter 
{
    void WriteLine(string s);
}

// Use this console writer for your live code
public class ConsoleOutputWriter : IOutputWriter
{
    public void WriteLine(string s)
    {
        Console.WriteLine(s);
    }
}

public abstract class Question
{
    private readonly IOutputWriter _writer;
    private readonly string _text;
    private readonly bool _default;

    public Question(IOutputWriter writer, params object[] args)
    {
        _writer = writer;
        _text = (string)args[0];
        _default = (bool)args[1];
    }

    public void Ask()
    {
        _writer.WriteLine(_text);
    }
}


[Test]
public void QuestionAsk()
    {
        var writer = new Mock<IOutputWriter>();

        var mock = new Mock<Question>(writer.Object, new object[]{"question text",true});

        mock.CallBase = true;

        var Question = mock.Object;

        Question.Ask();

        mock.Verify(m => m.Ask(), Times.Exactly(1));
        mock.Verify(w => w.WriteLine(It.Is<string>(s => s == "question text")), Times.Once)

    }

关于c# - 在单元测试中检查控制台输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20595294/

相关文章:

c# - 根据百分比从 IEnumerable 中选择行

c# - ASP.Net 项目,一个大的 dll 和我糟糕的设计决定

c# - 使用新值更新现有对象

python - 单元测试二进制文件输出

delphi - 寻找具有良好单元测试覆盖率的开源Delphi项目

angularjs - 如何使用 karma 和 jasmine 测试 screen.width 条件

c# - 如何在 C#/.NET 中找到本地计算机的 FQDN?

unit-testing - 如何在 repo 中测试/模拟 Hive (Flutter) 打开框逻辑?

java - 覆盖颜色在eclipse中的含义

html - Linux上的跨浏览器测试