【问题标题】:Can I tell if a property has been accessed via Rhino Mocks我可以判断一个属性是否已通过 Rhino Mocks 访问
【发布时间】:2009-08-18 23:21:27
【问题描述】:

我在使用 Rhino Mocks 模拟的接口中有一个属性。我想知道它是否在我的单元测试中被访问过。

有没有办法查看是否通过 Rhino Mocks 访问了该属性?

我找到了这段代码here,但它似乎不起作用:

string name = customerMock.Name;
customerMock.AssertWasCalled(x => {var ignored = x.Name;});

我复制了这段代码,得到以下信息:

Rhino.Mocks.Exceptions.ExpectationViolationException: IAddAddressForm.get_FirstName(); Expected #1, Actual #0..

我想使用这种语法,但我一定遗漏了一些东西。我用存根(而不是模拟)调用它有什么不同吗?

【问题讨论】:

    标签: c# visual-studio-2008 rhino-mocks rhino-mocks-3.5


    【解决方案1】:

    有没有办法查看属性 是通过 Rhino Mocks 访问的?

    是的。您可以为该属性设置一个期望值。如果验证没有抛出,那么您知道该属性已被访问:

    var mocks = new MockRepository();
    IFoo foo = mocks.DynamicMock<IFoo>;
    // this sets up an expectation that Name is accessed, and what it should return
    Expect.Call(foo.Name).Return("John Doe"); 
    mocks.ReplayAll()
    
    // test something that uses IFoo here ...
    
    mocks.VerifyAll();  // Throws if foo.Name was not accessed after ReplayAll()
    

    这一切都假设您希望访问foo.Name。如果您的目标是验证它是否被访问,那么您应该只使用 StrictMock 而不是 DynamicMock。任何意外调用都会引发严格的模拟。

    【讨论】:

      【解决方案2】:

      原来我使用的语法确实有效。但它仅在属性未处于 PropertyBehavior 模式时才有效。 (这是存根的默认设置,可以为模拟打开)。

      一旦打开 PropertyBehavior 模式,该语法就不起作用。根据Ayende,您必须检查该点的值。

      【讨论】:

        【解决方案3】:

        如果您想断言在伪造的对象上调用了方法或访问了属性,则应始终使用模拟。存根适用于那些您不想测试交互,但只想确保对某个对象的调用返回特定值以使逻辑流动的情况。

        【讨论】:

          【解决方案4】:

          我相信 StrictMock 是您正在寻找的。有一些关于它的信息here。据说不鼓励使用它,因为它会使测试变得过于脆弱,但它应该可以帮助您实现您想要做的事情。

          【讨论】:

            【解决方案5】:

            您可以使用StackFrame 类检查调用堆栈。不是很干净,但它应该会给出想要的结果......

            【讨论】:

              【解决方案6】:

              我通常使用Moq,它使用 Castle,因此您可以考虑使用它来代替/与 Rhino Mocks 一起使用。这是你可以在那里做的:

              // expects an invocation to set the value to "foo"
              mock.SetupSet(foo => foo.Name = "foo");
              
              // or verify the setter directly
              mock.VerifySet(foo => foo.Name = "foo");
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2014-04-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多