我可以判断是否通过Rhino Mocks访问了某个属性

时间:2009-08-18 23:21:28

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

我在使用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..

我想使用这种语法,但我必须遗漏一些东西。我用一个存根(不是模拟)来调用它会有所作为吗?

6 个答案:

答案 0 :(得分:3)

  

有没有办法查看该属性   是通过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。任何意外的电话都会引发严格的模拟。

答案 1 :(得分:1)

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

启用PropertyBehavior模式后,该语法不起作用。根据{{​​3}},您必须检查此时的值。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我相信StrictMock正是您所寻找的。有一些信息here。它的使用被认为是气馁的,因为它可以使测试过于脆弱,但它应该可以帮助你实现你想要做的事情。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我通常使用使用Castle的Moq,因此您可以将其视为与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");