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

Ami*_*ard 4 testing unit-testing moq mocking

我想用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();
            }

        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我的考验:

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();
    }
Run Code Online (Sandbox Code Playgroud)

那么,为什么会出现此错误:

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

Spo*_*ock 16

单元测试有几个问题.我只会强调事物的嘲笑方面,因为它与你提出的问题有关.你的问题也引用了"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();
    }
Run Code Online (Sandbox Code Playgroud)

你写这个测试的方式,起订量不会对GetConvertedFileToZip验证这个测试失败,从根本上是因为起订量不能为虚方法GetConvertedFileToZip提供覆盖.您必须创建一个代理i,e mock.Object.

如果您修改您的测试以这样的方式让你的SUT(被测Sysytem),消耗了嘲笑的对象/代理对象的确认将部分工作的一个实例(部分意味着你正朝着正确的方向).还有别的东西可以解决我在下面描述的内容.

假设您的SUT如下所示

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

你的考试

    [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();
    }
Run Code Online (Sandbox Code Playgroud)

这会产生例外.这是因为在通过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();
    }
Run Code Online (Sandbox Code Playgroud)