【问题标题】:Moq Error : Moq.MockVerificationException: The following setups were not matchedMoq 错误:Moq.MockVerificationException:以下设置不匹配
【发布时间】:2014-01-02 01:16:52
【问题描述】:

我想用 mock 测试我的方法,但它抛出了这个异常。我的课是这样的(这个类对文件执行一些简单的操作,就像解压缩文件一样):

public class FileActions
    {
        public virtual void Decompress(FileInfo fileInfo, DirectoryInfo directoryInfo)
        {
            ZipFile.ExtractToDirectory(fileInfo.FullName, directoryInfo.FullName);
        }

        public virtual FileInfo GetConvertedFileToZip(FileInfo fileInfo)
        {
            try
            {
                var changeExtension = Path.ChangeExtension(fileInfo.FullName, "zip");
                File.Move(fileInfo.FullName, changeExtension);
                return new FileInfo(changeExtension);
            }
            catch (Exception)
            {

                throw new FileNotFoundException();
            }

        }
    }

这是我的测试:

public void TestMockedMethodForNotNull()
    {
        var mock = new Mock<FileActions>();

        var fInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg");
        mock.Setup(s => s.GetConvertedFileToZip(fInfo)).Verifiable();
        mock.VerifyAll();
    }

那么,为什么会出现这个错误:

Moq.MockVerificationException:以下设置不匹配: FileActions2 s => s.GetConvertedFileToZip(D:\ZipFiles\elmah.nupkg)

【问题讨论】:

  • 你类哪个mock是“FileActions”,什么是“FileActions2”?
  • 是的,但这是我写问题时的错误。这不重要。那么,为什么会出现此错误?
  • 谢谢,是的,意识到这是错误的 :) 在下面回答了您的问题。

标签: unit-testing testing mocking moq


【解决方案1】:

您的单元测试存在几个问题。我只会强调事物的嘲弄一面,因为它与您提出的问题有关。你的问题也提到了“FileActions2”,我认为这个 最初添加问题时出现错误。

你测试:

   [TestMethod]
    public void TestMockedMethodForNotNull()
    {
        var mock = new Mock<FileActions>();

        var fileInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg");

        mock.Setup(s => s.GetConvertedFileToZip(fileInfo)).Verifiable();

        mock.VerifyAll();
    }

您编写此测试的方式,Moq 不会在 GetConvertedFileToZip 上验证 此测试从根本上失败,因为 Moq 无法为虚拟方法 GetConvertedFileToZip 提供覆盖。您必须创建一个代理,即 mock.Object。

如果您以这样的方式修改您的测试,以便您的 SUT(被测系统)使用模拟对象/代理对象的实例 您的验证将部分工作(部分意味着您正朝着正确的方向前进)。还有一些我在下面描述的要解决的问题。

假设您的 SUT 如下所示

public class Sut
{
    public void Do(FileActions fileActions)
    {
        var fileInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg");
        var s = fileActions.GetConvertedFileToZip(fileInfo);
    }
}

你的测试

    [TestMethod]
    public void TestMockedMethodForNotNull()
    {
        var mock = new Mock<FileActions>();

        var fileInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg");

        mock.Setup(s => s.GetConvertedFileToZip(fileInfo)).Verifiable();

        var sut = new Sut();

        sut.Do(mock.Object);


        mock.VerifyAll();
    }

这会产生异常。这是因为当通过 Sut 调用时,您设置的 fileInfo 与验证不匹配。

如果你要修改这个测试如下,这会成功

    [TestMethod]
    public void TestMockedMethodForNotNull()
    {
        var mock = new Mock<FileActions>();

        //var fileInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg");

        mock.Setup(s => s.GetConvertedFileToZip(It.IsAny<FileInfo>())).Verifiable();

        var sut = new Sut();

        sut.Do(mock.Object);

        mock.VerifyAll();
    }

【讨论】:

  • 非常感谢。不幸的是,我没有足够的观点来投票赞成您的答案。谢谢:)
  • 没问题,您可能是新用户,如果您不知道,如果此答案足够,您可以将其标记为您的问题的答案。这样其他人就会知道正确的答案。只需单击对勾。无论如何,感谢您的 cmets :)
  • 我不是新用户。自 2008 年以来我一直是 stackoverflow 的成员,但我决定更改我的帐户并连接我的谷歌帐户,因此我是我的新帐户的新用户。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多