Stub属性setter与Rhino.Mocks在调用时执行一个动作?

时间:2010-11-07 03:17:08

标签: c# unit-testing mocking rhino-mocks

这可以通过以下方法完成:

myStub.Stub(x => x.SomeMethod()).WhenCalled(x => do something);

在调用属性设置器时,有什么方法可以做同样的事情吗?

5 个答案:

答案 0 :(得分:3)

以下内容可行:

Expect.Call(myStub.MyProperty).WhenCalled(p => Console.WriteLine("Called")).Return("Test result");

请注意,这仅适用于您的属性(在这种情况下为MyProperty)被声明为虚拟的情况。

答案 1 :(得分:1)

我没有Visual Studio方便,但我确信这些内容应该有效:

myStub.Stub(x => x.SomeProperty = null).WhenCalled(x => do something);

答案 2 :(得分:1)

将模拟放回“记录”模式并使用旧记录/回放语义来设置属性设置器的期望:

stub.BackToRecord();
Expect.Call(stub.SomeProperty).SetPropertyAndIgnoreArgument().WhenCalled(p => ...do something...);
stub.Replay();

答案 3 :(得分:1)

所以Pieter和Patrick已经给出了正确的答案,但如果您想使用开箱即用,更完整的例子可能有所帮助。所以这就是:

[Test]
public void Test()
{
    var fakedInterface = MockRepository.GenerateMock<ISite>();

    // Stub property setter and call own lambda when invoked.
    fakedInterface.BackToRecord();
    Expect.Call(fakedInterface.Name).SetPropertyAndIgnoreArgument().WhenCalled(a =>
    {
        Assert.That(a.Arguments.Length, Is.EqualTo(1));
        Assert.That(a.Arguments[0], Is.EqualTo("abc"));

        // Stub property getter with provided value.
        fakedInterface.Stub(x => x.Name).Return((String)a.Arguments[0]);
    });
    fakedInterface.Replay();

    // Set the property (and let our above lambda be invoked)
    fakedInterface.Name = "abc";

    // Get the property (the value that was freshly stubbed within the lamba.
    var result = fakedInterface.Name;
    Assert.That(result, Is.EqualTo("abc"));
}

此示例中的下一个技巧是,返回值将在lambda中存根,以便您可以在setter中调用/测试任何您喜欢的内容,并且在下一步中您可以接收此值通过正常的财产吸气剂。

答案 4 :(得分:1)

我知道这有点旧,但所有答案都有点不清楚。 从那时起,Ayende已经在新旧构造中放置了一个处理这个问题的部分,如果我再次发现这个结构,我认为这可能会有所帮助。

Rhino Mocks 3.5

  

添加了两个期望设置属性的结构。   以前可以使用Rhino.Mocks,但是有过   在流畅的界面语法中没有富有表现力的构造。

     

具有特定值的属性设置期望被指定为   这样:

     

Expect.Call(mockedCustomer.Name).SetPropertyWithArguments( “Ayende”);

     

仅用于测试交互,属性设置期望   没有指定值的方式是这样做的:

     

Expect.Call(mockedCustomer.Name).SetPropertyAndIgnoreArguments();

     

这些新结构等于:

     

使用(mocks.Record()){mockedCustomer.Name =“Ayende”; //设置一个   期望设定一个特定的论点。

     

LastCall.IgnoreArguments(); //我们可以忽略这个论点   期望,给我们期望设定   财产,不论实际价值。 }