2

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

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

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

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

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

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

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

4

6 回答 6

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。严格的模拟将抛出任何意外的调用。

于 2009-08-19T01:08:05.373 回答
1

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

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

于 2009-08-20T04:29:07.800 回答
1

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

于 2009-08-20T10:26:07.767 回答
0

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

于 2009-08-18T23:34:37.620 回答
0

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

于 2009-08-18T23:38:02.510 回答
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");
于 2009-08-18T23:47:34.050 回答