我有一个我想测试的对象。它应该调用一个名为ProcessFile()
的方法,它将文件名作为输入。这种方法被嘲笑了。
我可以轻松验证该方法是否被称为预期的次数。实际的文件名是随机生成的,然而如果你调用ProcessFile()
那么显然它应该处理的文件必须存在于磁盘上。如果没有,就会出现问题。
目前正在测试的代码被破坏;它有时会使用不存在的文件名调用该方法。我真的,真的,非常希望错误消息说哪个文件不存在。
我能够进行各种测试,以检测出错误是这样的:
mockProcessor.Verify(
x => x.ProcessFile(It.Is<string>(s => s != null && File.Exists(s)),
Times.Exactly(103)
);
如果磁盘上不存在任何文件,则测试失败。但是,它没有声称该方法未被调用所需的次数。我理解为什么它会说明这一点,但这是高度误导性消息。 真正的问题是磁盘上不存在的文件 - 测试输出没有特别清楚的事实。 我知道发生了什么,但是下一个可怜的####来处理这段代码可能没有线索。
我真正想要的是检查所需的调用次数是否已经发生,并且在每次调用中,指定的文件都存在于磁盘上。有什么建议吗?
答案 0 :(得分:1)
您可以将s => s != null && File.Exists(s)
更改为声明正文:
s =>
{
if (s == null)
{
return false;
}
if (!File.Exist(s))
{
throw new FileNotFoundException(s);
}
return true;
}
或者提取一个方法并调用它(s => FileNotNullAndExists(s)
)。
答案 1 :(得分:1)
我想出了一个使用回调的解决方案:
Action<string> callback = (file) => Assert.IsTrue(File.Exists(file));
mockProcessor.Setup(x => x.ProcessFile(It.IsAny<string>)).Callback(callback);
事实证明,我正在尝试追捕的错误取决于ProcessFile()
在处理后删除文件的事实。当然,将它添加到上面的回调中是微不足道的。
所以现在我可以尝试修复这个错误......