呼叫无效,最后一次呼叫已被使用或未进行任何呼叫
当我尝试将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()
没有帮助。
我的解决方案是从属性中提取逻辑并进入内部方法,然后我将依赖项注入此方法(作为参数)。