Moq用对象参数验证


86

我正在尝试验证作为类的参数。被测试的代码很好。该错误正在测试中。

我尝试了两种方法,但都失败了。

这是我的尝试:

1:

this.MockImageResizeFilter.Verify(m => m.Filter(this.UploadedFileData, new ImageFilterOptions()
    {
        Width = 256,
        Height = 256,
    }));

即使作为第二个参数传递的对象具有相同的属性,这始终会失败。第一个参数已通过验证。

2:

this.MockImageResizeFilter.Setup(m => m.Filter(It.IsAny<byte[]>(), It.IsAny<ImageFilterOptions>()))
    .Callback<byte[], ImageFilterOptions>((data, options) =>
        {
            Assert.AreEqual(this.UploadedFileData, data, "data");
            Assert.AreEqual(filterOptions.Width, options.Width, "Width");
            Assert.AreEqual(filterOptions.Height, options.Height, "Height");
        }
    );

即使它应该失败,也总是通过。回调中的Asserts确实会失败,但是不会将异常传递给外部上下文,因此测试始终会通过。

您能帮我找出我做错了什么吗?

Answers:


138

第一次尝试更接近于您想要实现的目标。

失败的原因是Moq(可能)使用Object.Equals了掩盖来测试ImageFilterOptions调用该方法的参数是否与您在调用中提供的 参数相同Verify

他们不可能是同一实例,因为在中Verify创建new ImageFilterOptions()

您可以使用Moq的It.Is语法来提供一个表达式,以验证参数是否为预期值,而不是通过这种方式执行参数检查。

在您的情况下,您要检查参数的类型,ImageFilterOptions以及WidthHeight均设置为256。允许您执行此操作的表达式是:

It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)

因此,您的呼叫Verify可能如下所示:

this.MockImageResizeFilter.Verify(m => m.Filter(
            this.UploadedFileData,
            It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)));

1
我必须使用的语法为:It.Is((ImageFilterOptions p) => p.Width == 256 && p.Height == 256)。没有通用的Is
Stanislav

1
通用版本适用于我,并且在API文档中nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue)-您是否使用了过时的Moq版本?
蒂姆·阿贝尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.