当函数必须写入标准输出时,如何对 C# 函数进行单元测试

How do I unit test a C# function when that function must write to stdout

我有一个函数,其规范要求它写入标准输出。当我测试时,stdout 是 MIA,我找不到它。我需要抓住它,以便断言预期的响应。该方法将由命令管道调用。

此外,我将编写一些管道函数:==stdin==> method ==stdout==>。这意味着我的单元测试需要将测试数据推送到标准输入中。

我正在编写方法之前计划测试场景,并没有找到很多最新信息。我希望 MSTest 可能为此提供一些辅助方法。如果没有,我可以使用一些关于如何编写自己的指南。

我建议传入一个 TextReader 和一个 TextWriter,也许作为可选参数。然后您可以从 reader 中读取并写入写入器。那么调用者要么传入Console.OutConsole.In,要么你可以在方法中进行:

public void Foo(TextReader reader = null, TextWriter writer = null)
{
    reader = reader ?? Console.In;
    writer = writer ?? Console.Out;
    // Read and write
}

(或者使用调用带有两个必需参数的重载的无参数重载。)

在单元测试中,使用 StringReaderStringWriter

如果您可以要求 调用者传入 reader 和编写器,这将允许您避免将代码与控制台紧密耦合,从而导致通常更清晰的代码 - 我可以想象一整套方法,所有这些方法都接受 reader/writer (或为它们使用字段),因此只有最顶层的代码 "knows" 它正在处理控制台。