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

时间:2009-08-19 16:31:21

标签: c# visual-studio visual-studio-2008 rhino-mocks rhino-mocks-3.5

当我尝试将模拟设置为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; }
    }
}

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

5 个答案:

答案 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()没有帮助。

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