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

风流意气都作罢 提交于 2019-12-01 16:08:39

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.

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

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.

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.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!