unit testing帮助。 如何测试输出到控制台的消息?
我是unit testing的新手。 如何检查控制台输出? 我有
namespace XXShapes { public abstract class XXShape { public virtual void DrawXXShape() { Console.WriteLine("The XXShape was drawn."); } } public class XXCircle : XXShape { public override void DrawXXShape() { Console.WriteLine("The XXCircle was drawn."); } }
}
namespace XXShapes.Test { [TestFixture] public class XXShapeTest { [Test] public void MyFirstTest() { XXShape s = new XXCircle(); string expected = "The XXCircle was drawn."; s.DrawXXShape(); string actual = Console.ReadLine(); Assert.AreEqual(expected, actual); } } }
我应该如何正确地测试这个? 谢谢你的任何指示。 干杯,〜ck
字面上的答案是你在调用被测试的类之前使用Console.SetOut
将stdout
引导到memoryStream或类似的东西,你可以在以后检查它们的内容。
更好的答案是使用一个模拟框架,比如Rhino Mocks来创建抽象类的具体实例,并期望设置为调用DrawXXShape
方法。
您不需要测试’Console.WriteLine’例程,因为您必须假设它有效 – 它不是您的代码,所以您为什么要测试它。 您需要测试是否生成传递给’Console.WriteLine’的正确字符串
换句话说,而不是:
public override void DrawXXShape() { Console.WriteLine("The XXCircle was drawn."); }
你可以这样做:
public override void DrawXXShape() { Console.WriteLine(produceXxCircle()); } public string produceXxCircle() { return "The XXCircle was drawn."; }
然后在测试用例中:
Assert.AreEqual(produceXxCircle(), "The XXCircle was drawn.");
希望能帮助到你。 告诉西蒙
那根本不是你要做的。
在测试中,您通常会检查对象的状态,例如:
Assert.IsTrue(foo.Field, Equals, "hello")
取决于您选择的框架的工作方式。 因此,您通常需要更改方法以符合此模型。
我假设其他一些测试测试绘图function – 如果你现在想要测试你的类特别是在控制台上写一些东西,那么你应该抽象写入控制台的想法。
在其中创建一个带有WriteLine()方法的接口,并将实现此接口的实例注入XXShapes。 您的测试可以注入模拟或存根,可以捕获写入的字符串并在测试中测试其内容。