我在使用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..
我想使用这种语法,但我必须遗漏一些东西。我用一个存根(不是模拟)来调用它会有所作为吗?
答案 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");