19

当我尝试将模拟设置为具有时出现此错误PropertyBehavior()

System.InvalidOperationException:System.InvalidOperationException:无效调用,已使用最后一次调用或未进行调用(确保您正在调用虚拟(C#)/可覆盖(VB)方法)..

我正在尝试仅使用Rhino Mocks 3.5 (Arrange, Act, Assert)

这是我的代码:

    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; }
    }
}

无论如何,我认为虚拟不会成为问题,因为我正在传递一个接口,但我显然错过了一些东西。

4

5 回答 5

10

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

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

Rhino Mocks 现在完全通过扩展方法工作。我每次都打的唯一静态电话是MockRepository.GenerateStub.

于 2009-08-19T22:00:55.720 回答
1

您提到使用存根而不是模拟,但在您更改它之前,我会注意到奇怪的是,当我使用 GenerateStub 时出现 Invalid Call 异常,但在使用 GenerateMock 时却没有。

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

这会引发 Invalid call 异常,是的,IAddressView.Message 确实有一个 getter 和 setter。

于 2009-10-13T08:15:06.807 回答
1

当我尝试对非虚拟方法设置期望时收到此错误。

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

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

于 2014-07-09T17:42:45.153 回答
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);



}
于 2009-08-19T16:40:09.723 回答
0

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

我的解决方案是将逻辑从属性中提取出来并放入一个内部方法中,然后我将依赖项注入到该方法中(作为参数)。

于 2012-06-21T16:08:16.950 回答