Unit Test Help. How do I test for a message output to console?

前端 未结 4 360
暖寄归人
暖寄归人 2021-01-17 21:55

I am a newbie to unit testing. How do I check the for console output? I have

namespace XXShapes
{
    public abstract class XXShape
    {
        public virt         


        
相关标签:
4条回答
  • 2021-01-17 22:06

    That's not at all what you'd do.

    In your test you will typically check for the state of the object, with something like:

    Assert.IsTrue(foo.Field, Equals, "hello")
    

    Depending on how your chosen framework works. So you'll need to change your approach, in general, to conform to this model.

    0 讨论(0)
  • 2021-01-17 22:12

    You don't need to test 'Console.WriteLine' routine because you have to assume it works - it is not your code, so why do you want to test it. You need to test whether you produce correct string that is passed to 'Console.WriteLine'

    In other words, instead of:

    public override void DrawXXShape()
    {
        Console.WriteLine("The XXCircle was drawn.");
    }
    

    you could do:

    public override void DrawXXShape()
    {
        Console.WriteLine(produceXxCircle());
    }
    
    public string produceXxCircle()
    {
        return "The XXCircle was drawn.";
    }
    

    and then in the test case:

    Assert.AreEqual(produceXxCircle(), "The XXCircle was drawn.");
    

    Hope it helps. Regads Simon

    0 讨论(0)
  • 2021-01-17 22:15

    I'm assuming that some other tests test for the drawing capabilities - If you now want to test that your classes write something in particular to the console, then you should abstract the idea of writing to the console.

    Create an interface with a WriteLine() method in it and inject instances that implement this interface into XXShapes. Your tests can inject mocks or stubs which can capture the strings that are written and test their contents in the tests.

    0 讨论(0)
  • 2021-01-17 22:31

    The literal answer would be that you would use Console.SetOut before calling the class under test to direct stdout into a memoryStream or similar, whose contents you can later inspect.

    The better answer would be to use a mocking framework, like Rhino Mocks to create a concrete instance of your abstract class, with an expectation set that the DrawXXShape method would be called.

    0 讨论(0)
提交回复
热议问题