验证磁盘上是否存在方法参数

时间:2014-03-25 11:48:52

标签: c# integration-testing moq

我有一个我想测试的对象。它应该调用一个名为ProcessFile()的方法,它将文件名作为输入。这种方法被嘲笑了。

我可以轻松验证该方法是否被称为预期的次数。实际的文件名是随机生成的,然而如果你调用ProcessFile()那么显然它应该处理的文件必须存在于磁盘上。如果没有,就会出现问题。

目前正在测试的代码被破坏;它有时会使用不存在的文件名调用该方法。我真的,真的,非常希望错误消息说哪个文件不存在。

我能够进行各种测试,以检测出错误是这样的:

mockProcessor.Verify(
  x => x.ProcessFile(It.Is<string>(s => s != null && File.Exists(s)),
  Times.Exactly(103)
);

如果磁盘上不存在任何文件,则测试失败。但是,它没有声称该方法未被调用所需的次数。我理解为什么它会说明这一点,但这是高度误导性消息。 真正的问题是磁盘上不存在的文件 - 测试输出没有特别清楚的事实。 知道发生了什么,但是下一个可怜的####来处理这段代码可能没有线索。

我真正想要的是检查所需的调用次数是否已经发生,并且在每次调用中,指定的文件都存在于磁盘上。有什么建议吗?

2 个答案:

答案 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() 在处理后删除文件的事实。当然,将它添加到上面的回调中是微不足道的。

所以现在我可以尝试修复这个错误......