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参数是否是预期的。
在你的情况下,你想检查参数是ImageFilterOptions
types,并且Width
和Height
都设置为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)));