【问题标题】:Behavior testing with Moq: how to set expectations on a non-virtual property使用 Moq 进行行为测试:如何对非虚拟财产设定期望
【发布时间】:2011-07-10 08:23:19
【问题描述】:

我是 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。

起订量可以做到这一点吗?如果不是,有哪些框架可以做到这一点?

【问题讨论】:

    标签: c# .net unit-testing moq


    【解决方案1】:

    您的when 不正确。

    mock.Object.Size = anonymSize;
    

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


    更新

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

    所以我要做的是:

    // Given
    Visual v = new Visual();
    
    // When
    v.Size = someSize;
    
    // Then
    Assert.That(v.Bounds == someExpectedBounds);
    

    【讨论】:

    • @Aliostad:我明白了,事实上你是对的。我想测试的是,Visual 类的具体实现在 Size 更新时确实调用了属性 Bounds。我的想法是通过创建一个检查这个预期行为的测试来明确这个合同。希望这能让我的意图更清楚,如果没有,请告诉我。再次感谢您的回答,非常感谢您的反馈!
    • 对了,我忘了说Visual是一个带有受保护构造函数的抽象类。
    • 我想我的最后一条评论来得太晚了,对此感到抱歉。视觉是抽象的,构造函数是受保护的,所以我不能这样做(我不想更改 API 类,因为保持抽象而不是直接可实例化是有意义的)。此外,我想使用行为验证,而不是状态验证(但如果在这种情况下使用行为验证是错误的,我肯定希望有人能详细说明为什么会这样)。
    • 在你的测试中写一个继承自它的类然后测试它。
    • 是的,这适用于状态验证。最后我想出了如何使用行为测试(简单地说,我有一个设计问题,如果我想使用行为测试,我需要改进它)。非常感谢您的投入!我发现它们很有用,它们让我避免通过模拟 SUT 来编写无用的测试:)
    猜你喜欢
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2011-01-30
    • 2023-03-29
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    相关资源
    最近更新 更多