当我尝试将模拟设置为PropertyBehavior()
时,我收到此错误:
System.InvalidOperationException:System.InvalidOperationException: 呼叫无效,最后一次呼叫已被使用或未进行任何呼叫(确保您正在调用虚拟(C#)/可覆盖(VB)方法)..
我只想使用Rhino Mocks 3.5(安排,行动,断言)
这是我的代码:
private IAddAddressForm form;
private AddAddressMediator mediator;
[TestInitialize()]
public void MyTestInitialize()
{
form = MockRepository.GenerateMock<IAddAddressForm>();
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; }
}
}
无论如何,我认为虚拟不会成为问题,因为我在界面中传递,但我显然遗漏了一些东西。
答案 0 :(得分:10)
之前从未使用PropertyBehavior
,但这是您正在寻找的语法吗?
form.Stub(x=>x.OKButtonEnabled).PropertyBehavior()
Rhino Mocks现在完全通过扩展方法工作。我每次发出的唯一静态调用是MockRepository.GenerateStub
。
答案 1 :(得分:1)
你提到使用存根而不是模拟但是在你改变之前我会注意到奇怪的是,当我使用GenerateStub时我得到了无效调用异常,但是当我使用GenerateMock时却没有。
View = MockRepository.GenerateStub<IAddressView>();
View.Stub(v => v.Message).PropertyBehavior();
这会抛出无效的调用异常,是的,IAddressView.Message确实有一个getter和setter。
答案 2 :(得分:1)
当我尝试在非虚方法上设置期望时,我收到此错误。
mockedObject.Expect(a => a.NonVirtualMethod()).Returns(null);
当我将NonVirtualMethod虚拟化时,错误就消失了。
答案 3 :(得分:0)
我认为在设置所有期望之后以及开始使用此模拟之前,您必须执行MockRepository.ReplyAll()。所以我的猜测是你必须在mediator = new AddAddressMediator(form);之前移动Expect.Call行,然后在那之后粘贴回复:
[TestInitialize()]
public void MyTestInitialize()
{
form = MockRepository.GenerateMock<IAddAddressForm>();
// 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);
}
答案 4 :(得分:0)
当我尝试在C#中的对象上调用internal
属性(仅限getter)时,我遇到了这个问题。在这种情况下,添加.PropertyBehavior()
没有帮助。
我的解决方案是从属性中提取逻辑并进入内部方法,然后我将依赖项注入此方法(作为参数)。