单元测试代码称为抑制Debug.WriteLine和Trace.WriteLine

时间:2012-03-09 23:06:04

标签: c# unit-testing visual-studio-debugging

我在运行测试时需要看一些代码,并且 TestContext必须是我需要的Test类的一部分 显示正在测试的类的debug.writelines。我考虑过 只需将TestContext传递给我的MessageStatus静态方法即可 必须但是那将是一个PITA因为UnitTest类会有 将TestContext传递给它正在测试的对象。太紧了 我很喜欢。

基本用语

 [TestMethod]
       public void TestA()
       {
           //....
           Assert.IsTrue(Blah.Blah()));
       }



public void Blah()
{
    Debug.WriteLine("Hello");
}
当我运行单元测试时,

永远不会出现!

我可以将其更改为:

TestContext t;
 [TestMethod]
       public void TestA()
       {
           //....
           Assert.IsTrue(Blah.Blah(t)));
       }



public void Blah(TestContext p1)
{
    p1.WriteLine("Hello");
}

但这是疯了,这意味着改变我所有的签名和紧密耦合。我在How to write output from a unit test?阅读了帖子,但这没有帮助:(

2 个答案:

答案 0 :(得分:2)

如果您需要查看Debug.WriteLine生成的行或处理Debug.Assert生成的断言,您可以创建自己的System.Diagnostic.TraceListener以将输出重定向到TestContext - 请参阅我的回答What do I have to do so that assertions won't block automated tests anymore?

public class MyListenerThatDoesNotShowDialogOnFail: 
       System.Diagnostics.TraceListener
{
    // This is to avoid message box on Debug.Assert(false);
    public override void Fail(string message, string detailMessage)
    {// do something UnitTest friendly here like Assert.Fail(false)
    }

    // This (+Write) is to redirect Debug.WriteLine("Some trace text");
    public override void WriteLine(string message)
    {// do something UnitTest friendly here like TestContext.Write(message)
    }
}

测试设置监听器中的某个位置。请注意,下面的示例已经过简化,您可能希望保存当前的侦听器并在测试结束时进行恢复。

Debug.Listeners.Clear();
Debug.Listeners.Add(new MyListenerThatDoesNotShowDialogOnFail());

答案 1 :(得分:1)

您需要使用Console.WriteLine输出显示在测试运行器中。但是,这是一个坏事。我建议使用像nlog这样的日志框架。