Moq验证对象参数

时间:2012-11-21 14:48:34

标签: c# .net unit-testing moq

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

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

以下是我的尝试:

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确实失败了,但异常没有传递给外部上下文,因此测试总是通过。

你能帮我找到我做错的事吗?

1 个答案:

答案 0 :(得分:102)

第一次尝试更接近你想要达到的目标。

失败的原因是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)));