我可以告诉大家,如果属性已经通过犀牛嘲笑访问
-
18-09-2019 - |
题
我在我已使用犀牛制品嘲笑的接口的属性。我想知道,如果它是在我的单元测试访问。
有一种方法,以查看是否该属性经由犀牛制品访问?
我发现这个代码这里但它似乎不工作:
string name = customerMock.Name;
customerMock.AssertWasCalled(x => {var ignored = x.Name;});
我再现这个代码和我得到以下:
Rhino.Mocks.Exceptions.ExpectationViolationException: IAddAddressForm.get_FirstName(); Expected #1, Actual #0..
我想用这个语法,但我必须失去了一些东西。我有一个存根(而不是模拟)调用它并有所作为?
解决方案 2
原来我用不工作的语法。但是,只有当财产PropertyBehavior模式不工作。 (这是存根默认和可开启嘲笑)。
在PropertyBehavior模式被导通,则该语法不起作用。根据 Ayende 你必须检查在该点的值。
其他提示
有没有办法,看看属性 经由犀牛制品被访问?
是。您可以设置该属性的期望。如果验证不抛出,那么你就知道该属性被访问:
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。严格的模拟将抛出任何意外的呼叫。
如果你想断定方法被调用或伪造的对象上访问的属性,你应该总是使用一个模拟。存根用于在您不想要测试的互动这些情况,但只是想确保一些对象的调用返回一个特定值,使逻辑流程。
我相信StrictMock就是你所期待的。有一个关于它这里一些信息。它的使用被认为是气馁,因为它可以使测试太脆,但它应该可以帮助你实现你想要做什么。
可以使用StackFrame
类检查调用堆栈。不是很干净,但它应该得到期望的结果...
我通常使用起订量它采用城堡,所以你可能会考虑它,而不是/与犀牛制品一起。这是你如何能做到这有:
// 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");
不隶属于 StackOverflow