我有一个功能,它将学生的详细信息作为输入,并将他们的成绩单写入xml文件。当我试图在vs2008中创建单元测试时,我看到了一条消息 - “一个不返回值的方法无法验证”。我的函数不返回它只写入文件并返回的值。
我如何为此功能编写测试?
[TestMethod()]
public void StoreInformationTest()
{
StudentSettings target = new StudentSettings(); // TODO: Initialize to an appropriate
StudentSettings settings = null; // TODO: Initialize to an appropriate value
target.StoreInformation(settings);
Assert.Inconclusive("A method that does not return a value cannot be verified.");
}
提前致谢,
此致 约翰
答案 0 :(得分:2)
首先,如果大叔叔Visual Studio告诉你无法测试你的方法,那就不一定是真的了。
您应该将输出作为字符串返回到文件中,或者您的方法应该将TextWriter作为参数。在前一种情况下,您可以使用模拟框架,如另一个答案中所述,为测试中的方法提供一个伪造的TextWriter对象。
答案 1 :(得分:2)
通过良好的职责分离,您可以轻松地将文件替换为内存流。写入内存流而不是文件。然后你可以测试它的内容。但正如其他人所提到的,代码示例可能会揭示其他需求。
更新:
谢谢你的代码。看起来你的StudentSettings课程做得很多。将xml写入函数分离到自己的类中,从中提取接口,并将其作为构造函数参数注入到类中。然后你可以在测试期间用你自己的模拟替换它。
答案 2 :(得分:1)
您可以使用模拟框架来执行此操作。一个很好的例子是Moq。简单地说,您可以创建假对象,并告诉他们表现得像另一个。您还可以验证调用的频率和方法,调用方式以及调用方式。
编辑: 显示的快速入门指南here有一些很好的例子,可能会让您直接进入正确状态。在您的情况下,您可以创建包含写入文件的函数的类的moq。使用验证功能,您可以检查/验证函数调用的频率以及它是否正常运行。
答案 3 :(得分:0)
代码生成器只是建议它不能根据其返回值(void)验证您的测试,这非常有意义。我认为其他人提到这更像是一个占位符。在实际编写测试时,您需要确定您的通过标准是什么。你可以这么简单;
Assert.IsTrue(File.Exists(filePath));
如果您关心的是文件存在,或者您可以深入了解它,请验证其内容等等。这完全取决于你。