我是单位测试的新手。如何检查控制台输出? 我有
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
答案 0 :(得分:14)
字面上的答案是你在调用被测试的类之前使用Console.SetOut
将stdout
引导到memoryStream或类似的内容中,你可以在以后检查它们的内容。
更好的答案是使用像Rhino Mocks这样的模拟框架来创建抽象类的具体实例,并期望设置为DrawXXShape
方法。
答案 1 :(得分:4)
您不需要测试'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.");
希望它有所帮助。 Regads 西蒙
答案 2 :(得分:0)
这根本不是你要做的。
在测试中,您通常会检查对象的状态,例如:
Assert.IsTrue(foo.Field, Equals, "hello")
取决于您选择的框架的工作方式。因此,您通常需要更改您的方法以符合此模型。
答案 3 :(得分:0)
我假设其他一些测试测试绘图功能 - 如果你现在想要测试你的类特别是在控制台上写一些东西,那么你应该抽象写入控制台的想法。
在其中创建一个带有WriteLine()方法的接口,并将实现此接口的实例注入XXShapes。您的测试可以注入模拟或存根,可以捕获编写的字符串并在测试中测试其内容。