Moq用对象参数validation

我正在尝试validation是一个类的参数。 正在testing的代码是好的。 错误在testing中。

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

这是我的尝试:

1:

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

这总是失败,即使作为第二个parameter passing的对象具有相同的属性。 第一个参数validation正确。

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"); } ); 

这总是通过,即使它会失败。 callback中的断言确实失败,但是exception不会传递给外部上下文,因此testing总是通过。

你能帮我find我做错了什么吗?

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

它失败的原因是,Moq(可能)使用封面下的Object.Equals来testing该方法被调用的ImageFilterOptions参数是否与您在调用Verify提供的实例相同。

它们不可能是相同的实例,因为在Verify您将创build一个new ImageFilterOptions()

而不是这样执行参数检查,可以使用Moq的It.Is语法来提供一个expression式来validation参数是否是预期的。

在你的情况下,你想检查参数是ImageFilterOptionstypes,并且WidthHeight都设置为256 。 允许你这样做的expression式是:

 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)));