呼叫无效,最后一次呼叫已被使用或未进行任何呼叫

当我尝试将mock设置为具有PropertyBehavior()时,我收到此错误:

System.InvalidOperationException:System.InvalidOperationException:无效调用,最后一次调用已被使用或未进行任何调用(请确保您正在调用虚拟(C#)/ Overridable(VB)方法)。

我试图只使用Rhino Mocks 3.5 (安排,行动,断言)

这是我的代码:

  private IAddAddressForm form; private AddAddressMediator mediator; [TestInitialize()] public void MyTestInitialize() { form = MockRepository.GenerateMock(); mediator = new AddAddressMediator(form); // Make the properties work like a normal property Expect.Call(form.OKButtonEnabled).PropertyBehavior(); //I tried this too. I still get the exception //SetupResult.For(form.OKButtonEnabled).PropertyBehavior(); } [TestMethod] public void TestOKButtonEnabled() { form.OKButtonEnabled = true; Assert.IsTrue(form.OKButtonEnabled); } 

我知道我可以使用存根(对于我应该使用的代码),但我正在尝试学习Rhino Mocks。

最终,我希望能够确保访问多个属性的值。 (关于如何检查form.FirstName任何提示(即调用getter)也将受到赞赏。)

如果需要,这里是IAddressForm的代码:

 namespace AddressBook { public interface IAddAddressForm { string FirstName { get; set; } string LastName { get; set; } string Address1 { get; set; } string State { get; set; } string Address2 { get; set; } string ZipCode { get; set; } string City { get; set; } bool OKButtonEnabled { get; set; } } } 

无论如何,我认为虚拟不会是一个问题因为我在界面中传递,但我显然遗漏了一些东西。

之前从未使用过PropertyBehavior ,但这是您正在寻找的语法吗?

 form.Stub(x=>x.OKButtonEnabled).PropertyBehavior() 

Rhino Mocks现在完全通过扩展方法工作。 我每次发出的唯一静态调用是MockRepository.GenerateStub

你提到使用存根而不是模拟,但在你改变它之前我会注意到奇怪的是,当我使用GenerateStub时我得到了无效调用exception,但是当我使用GenerateMock时却没有。

 View = MockRepository.GenerateStub(); View.Stub(v => v.Message).PropertyBehavior(); 

这会抛出无效的调用exception,是的,IAddressView.Message确实有一个getter和setter。

当我尝试在非虚方法上设置期望时,我收到此错误。

 mockedObject.Expect(a => a.NonVirtualMethod()).Returns(null); 

当我将NonVirtualMethod虚拟化时,错误就消失了。

我认为你必须在设置所有期望之后和开始使用这个模拟之前做MockRepository.ReplyAll()。 所以我的猜测是你必须在mediator = new AddAddressMediator(form);之前移动Expect.Call行,然后在那之后粘贴回复:

 [TestInitialize()] public void MyTestInitialize() { form = MockRepository.GenerateMock(); // Make the properties work like a normal property Expect.Call(form.OKButtonEnabled).PropertyBehavior(); //I tried this too. I still get the exception //SetupResult.For(form.OKButtonEnabled).PropertyBehavior(); MockRepository.ReplyAll(); mediator = new AddAddressMediator(form); } 

当我试图在C#中的对象上调用internal属性(仅限getter)时,我遇到了这个问题。 在这种情况下,添加.PropertyBehavior()没有帮助。

我的解决方案是从属性中提取逻辑并进入内部方法,然后我将依赖项注入此方法(作为参数)。