MSTest:从Assert获取输出消息?

时间:2016-03-24 13:24:01

标签: c# logging console mstest

我正在使用MSTest框架编写集成测试。测试中的测试和代码都内置了重要的日志记录。

我正在试图找到一种方法来挂钩Assert的输出,这样我就可以将它与日志的其余部分一起写入日志文件。

例如,如果我有一个像

这样的测试方法
[TestMethod]
SomeRandomIntegrationTest()
{
  //Code to actually run the test, and includes logging.

  Assert.AreEqual(true, false, "This error message should also appear in the log");
}

我会得到

  

消息:Assert.AreEqual失败。预计是真的。得到了错误。此错误消息也应出现在日志中。

在我的日志文件中。

我试过

private StringBuilder testOutputBuilder;
private StringWriter testOutputWriter;
private TextWriter originalWriter;

[TestInitialize]
public virtual void Initialize()
{
  //Redirect the test output into the log files
  testOutputBuilder = new StringBuilder();
  testOutputWriter = new StringWriter(testOutputBuilder);
  originalWriter = Console.Out;
  Console.SetOut(testOutputWriter);
}

[TestCleanup]
public virtual void TestCleanup()
{
  if (TestContext.CurrentTestOutcome != UnitTestOutcome.Passed)
  {
     //File logging happens here using the testOutputBuilder
  }
  Console.SetOut(originalWriter);
  testOutputWriter.Dispose();
}

但是testOutputBuilder返回一个空字符串。

如何从MSTest中的断言方法中获取字符串输出?

2 个答案:

答案 0 :(得分:2)

我使用单独的函数编写了一个解决方法:

public string WriteErrorToFile(TextWriter textwriter, string errorMessage)
{
        textwriter.WriteLine(errorMessage);
        return errorMessage;
}

和测试中的代码应该修改如下:

Assert.AreEqual(true, false, WriteErrorToFile(originalWriter, "This error message should also appear in the log"));

如果您只有一个日志文件,则可以删除该函数的第一个参数。

希望这有帮助

答案 1 :(得分:2)

我这样做了:

public void OutputAssert(Action func)
    {
        try
        {
            func();
        }
        catch (Exception ex)
        {
            OutputToFile(ex.Message);
            throw ex;
        }            
    }

然后在测试中:

[TestMethod]        
public void TestAssertOutput()
    {
        OutputAssert(() => Assert.AreEqual(false, true, "test message"));
    }

输出为:

Assert.AreEqual failed. Expected:<False>. Actual:<True>. test message