How to write output from a unit test?

2019-01-16 07:11发布

Any call in my unit tests to either Debug.Write(line) or Console.Write(Line) simply gets skipped over while debugging and the output is never printed. Calls to these functions from within classes I'm using work fine.

I understand that unit testing is meant to be automated, but I still would like to be able to output messages from a unit test.

13条回答
走好不送
2楼-- · 2019-01-16 07:26

Try using TestContext.WriteLine() which outputs text in test results.

Example:

    [TestClass]
    public class UnitTest1
    {
        private TestContext testContextInstance;

        /// <summary>
        ///  Gets or sets the test context which provides
        ///  information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get { return testContextInstance; }
            set { testContextInstance = value; }
        }

        [TestMethod]
        public void TestMethod1()
        {
            TestContext.WriteLine("Message...");
        }
    }

The "magic" is described in MSDN as "The test framework automatically sets the property, which you can then use in unit tests."

查看更多
三岁会撩人
3楼-- · 2019-01-16 07:26

Try using:

Console.WriteLine()

The call to Debug.WriteLine will only be made during when DEBUG is defined.

Other suggestions are to use: Trace.WriteLine as well, but I haven't tried this.

There is also an option (not sure if VS2008 has it) but you can still Use Debug.WriteLine when you run the test with Test With Debuggeroption in the IDE

查看更多
Evening l夕情丶
4楼-- · 2019-01-16 07:27

Its a little late to the conversation.

I was also trying to get Debug or Trace or Console or TestContext to work in Unit Testing.

None of these methods would appeared work or show output in the output window.

    Trace.WriteLine("test trace");
    Debug.WriteLine("test debug");
    TestContext.WriteLine("test context");
    Console.WriteLine("test console");

VS2012 and Greater
(from comments) In Visual Studio 2012, there is no icon. Instead, there is a link in the test results called Output. If you click on the link, you see all of the WriteLine.

Prior to VS2012
I then noticed in my Test Results window, after running the test, next to the little success green circle , there is another icon, i doubled clicked it. It was my test results, and it included all of the types of writelines above.

查看更多
劳资没心,怎么记你
5楼-- · 2019-01-16 07:28

It depends on your test runner... for instance, I'm using XUnit, so in case that's what you are using, follow these instructions:

https://xunit.github.io/docs/capturing-output.html

This method groups your output with each specific unit test.


using Xunit;
using Xunit.Abstractions;

public class MyTestClass
{
    private readonly ITestOutputHelper output;

    public MyTestClass(ITestOutputHelper output)
    {
        this.output = output;
    }

    [Fact]
    public void MyTest()
    {
        var temp = "my class!";
        output.WriteLine("This is output from {0}", temp);
    }
}

There's another method listed in the link I provided for writing to your Output window, but I prefer the previous.

查看更多
混吃等死
6楼-- · 2019-01-16 07:31

Just ran into this. The cause/solution is a different variant of the above so I'll post.
My issue was that I was not getting an output because I was writing the result set from an async Linq call to console in a loop in an async context:

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345");

p.ForEachAsync(payment => Console.WriteLine(payment.Amount));

and so the test was not writing to the console before the console object was cleaned up by the runtime (when running only one test). Solution was to convert the result set to a list first so i could use the non async version of forEach():

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345").ToList();

p.ForEachAsync(payment =>Console.WriteLine(payment.Amount));
查看更多
我命由我不由天
7楼-- · 2019-01-16 07:35

I get no output when my Test/Test Settings/Default Processor Architecture setting and the assemblies that my test project references are not the same. Otherwise Trace.Writeline() works fine.

查看更多
登录 后发表回答