使用Moq进行行为测试:如何设置非虚拟属性的期望

时间:2011-03-07 12:53:31

标签: c# .net unit-testing moq

我是Moq的新手,如果“Bounds”属性未声明为虚拟,我想知道如何编写以下测试。

[TestMethod]
public void SettingSize_Sets_Bounds_ExactlyOnce()
{
    // given
    var mock = new Mock<Visual>();
    var anonymSize = DrawingHelper.AnonymousSize();
    // when 
    mock.Object.Size = anonymSize;
    // then
    mock.VerifySet(visual => visual.Bounds = new Rectangle(DrawingHelper.Origin(),anonymSize), Times.Once());
}

为了提供一点上下文,Visual类实现了IVIsual接口,声明了Bounds属性。因此,我可以使用该接口来创建Mock对象,但我没有看到我应该如何更改上面的测试以仍然测试具体的IVisual实现者(Visual类)的行为。

具体来说,我想确保在设置属性Size时,还设置了非虚拟属性Bounds。

Moq可以实现吗?如果不是那个允许这个的框架是什么?

1 个答案:

答案 0 :(得分:1)

您的when不正确。

mock.Object.Size = anonymSize;

您正在测试模拟:您需要在测试真实对象时为模拟对象的属性赋值。提供有关您要测试的实际对象的更多信息。


更新

你不需要模拟,你在模拟依赖项时测试类。你似乎没有任何依赖。

所以我要做的是:

// Given
Visual v = new Visual();

// When
v.Size = someSize;

// Then
Assert.That(v.Bounds == someExpectedBounds);