Moq错误:Moq.MockVerificationException:以下设置未匹配

时间:2013-12-14 06:56:55

标签: unit-testing testing mocking moq

我想用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 =&gt; s.GetConvertedFileToZip(d:\ ZipFiles \ elmah.nupkg)

1 个答案:

答案 0 :(得分:14)

您的单元测试有几个问题。我只会强调事物的嘲笑方面,因为它与你提出的问题有关。你的问题也提到“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提供覆盖。你必须创建一个代理i,e mock.Object。

如果以您的SUT(Sysytem Under Test)方式修改测试,则使用模拟对象/代理对象的实例 您的验证将部分工作(部分意味着您正朝着正确的方向)。还有别的东西可以解决我在下面描述的内容。

假设您的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();
    }