代码之家  ›  专栏  ›  技术社区  ›  Sarah Vessels

检查MSTEST单元测试中的输出

  •  7
  • Sarah Vessels  · 技术社区  · 15 年前

    我想捕获发送到标准输出的输出和MSTEST单元测试中的标准错误,以便我可以验证它。我以前在显式运行 Process 但是有没有一种方法可以处理MSTest过程本身?例如:

    [TestMethod]
    public void OutputTest()
    {
        MySnazzyMethod("input", 1, 'c');
        string stdOutFromMySnazzyMethod = /* ??? */;
        Assert.AreEqual("expected output", stdOutFromMySnazzyMethod);
    }
    
    4 回复  |  直到 14 年前
        1
  •  3
  •   JaredPar    15 年前

    我不确定是否有方法获取已经运行的 Process . 不过,您可以做的是稍微重构代码以避免写入 Console.WriteLine 但取而代之的是 TextWriter 实例并写入。

    在生产中,你可以通过 Console.Out 到方法。在测试代码中,您可以模拟这种类型并提供更准确的测试。例如

    [TestMethod]
    public void OutputTest()
    {
        var writer = new Mock<TextWriter>(MockBehavior.Strict);
        writer.Setup(x => x.WriteLine("expected output")).Verifiable();
        MySnazzyMethod(writer.Object, "input", 1, 'c');
        writer.Verify();
    }
    

    生产代码

    MySnazzyMethod(Console.Out, "input", 1, 'c');
    
        2
  •  3
  •   Community CDub    8 年前

    我喜欢 JaredPar's idea 但我不想进去 Console.Out Console.Error 对于我拥有的每个助手输出方法。但是,我的输出确实经过一个类,因此我只在其中设置了几个静态字段:

    internal static TextWriter _stdOut = Console.Out;
    internal static TextWriter _stdErr = Console.Error;
    

    我在输出处理程序类中更新了输出方法,以利用这些字段。然后我更新了该项目的assemblyinfo.cs,包括:

    [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("MyTestProject")]
    

    这样,我可以覆盖 _stdOut _stdErr 在我的测试方法中,调用要测试的方法(使用我的输出处理类),并确认我期望的输出。

    OutputHandler._stdOut = new StringWriter();
    MySnazzyMethod("input", 1, 'c');
    OutputHandler._stdOut.Flush();
    string expected = "expected output";
    string stdout = OutputHandler._stdOut.ToString().Trim(new[] { '\r', '\n' });
    Assert.IsFalse(string.IsNullOrEmpty(stdout));
    Assert.AreEqual(expected, stdout);
    
        3
  •  0
  •   Sky Sanders    15 年前

    只需添加一些 TraceListener 在类中初始化测试类。

        4
  •  0
  •   jcollum    14 年前

    我会用Moles把电话转到 Console 写入测试代码中的lambda方法。

    string result = ""; 
    System.Moles.MConsole.WriteLineString = (s) =>
      { result = s; }; 
    Assert.IsTrue(result == "The string I want", 
         "Failed to write to console correctly"); 
    

    见本文件第16页: Moles Reference Manual .

    推荐文章