Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Rhino.mock的存根属性设置器在调用时执行操作?_C#_Unit Testing_Mocking_Rhino Mocks - Fatal编程技术网

C# 使用Rhino.mock的存根属性设置器在调用时执行操作?

C# 使用Rhino.mock的存根属性设置器在调用时执行操作?,c#,unit-testing,mocking,rhino-mocks,C#,Unit Testing,Mocking,Rhino Mocks,这可以通过以下方法完成: myStub.Stub(x => x.SomeMethod()).WhenCalled(x => do something); 当调用属性设置程序时,是否有任何方法可以完成相同的操作?以下操作将起作用: Expect.Call(myStub.MyProperty).WhenCalled(p => Console.WriteLine("Called")).Return("Test result"); 请注意,只有当您的属性(在本例中为MyProper

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

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

当调用属性设置程序时,是否有任何方法可以完成相同的操作?

以下操作将起作用:

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

请注意,只有当您的属性(在本例中为
MyProperty
)声明为虚拟时,此选项才有效。

我手头没有Visual Studio,但我确信以下几点应该有效:

myStub.Stub(x => x.SomeProperty = null).WhenCalled(x => do something);
将模拟放回“记录”模式,并使用旧的记录/回放语义设置属性设置器的期望值:

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

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"));
}
[测试]
公开无效测试()
{
var fakedInterface=MockRepository.GenerateMock();
//存根属性设置器,并在调用时调用自己的lambda。
fakedInterface.BackToRecord();
Expect.Call(fakedInterface.Name).SetPropertyAndIgnoreArgument().WhenCalled(a=>
{
Assert.That(a.Arguments.Length,Is.EqualTo(1));
断言(a.Arguments[0],即.EqualTo(“abc”);
//具有提供值的存根属性getter。
存根(x=>x.Name).Return((字符串)a.Arguments[0]);
});
fakedInterface.Replay();
//设置属性(并调用上面的lambda)
fakedInterface.Name=“abc”;
//获取属性(lamba中新存根的值)。
var result=fakedInterface.Name;
断言。该(结果,为.EqualTo(“abc”));
}

本例中的下一个技巧是,返回值将在lambda中存根,这样您就可以在setter中调用/测试您喜欢的任何内容,并且在下一步中,您可以通过普通属性getter接收该值。

我知道这有点旧,但所有答案都有点不清楚。 从那时起,Ayende在一节中用新旧结构来处理这个问题,我认为如果我再次发现这个问题,可能会有所帮助

添加了两个用于预期属性设置的构造。 在犀牛身上,这是可能的。然而,在犀牛身上曾经有过嘲弄 fluent接口语法中没有表达性构造

指定具有特定值的属性设置期望值,如 这:

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

对于仅测试交互,属性设置为 如果没有指定值,则按以下方式执行:

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

这些新结构等同于:

使用(mocks.Record()){mockedCustomer.Name=“Ayende”;//设置 设置特定参数的期望值

LastCall.IgnoreArguments();//我们可以忽略此函数的参数 期望值,with为我们提供了设置 属性,而不考虑实际值。}


谢谢,彼特。我还需要做什么才能让它正常工作?我总是使用AAA语法,因此我没有录制/重播的经验,如果这是事实的话。当我以这种方式尝试时,我会得到一个
invalidoOperationException
“当模拟对象处于重播状态时,此操作无效。”另外,我是否为本质上是
void
方法(属性设置器)的方法设置了返回值?是的。您要做的是:1.记录您期望的内容(如答案)2.调用
mocks.ReplayAll()
其中mocks是
MockRepository
3.执行测试4.调用
mocks.VerifyAll()
。当一个或多个期望值未达到时,最后一个调用将
抛出
。如果您忽略最后一个调用,它将不会检查。Jay,您是否找到了解决此问题的AAA解决方案?这正是我尝试过的方法,但即使添加了.IgnoreArguments()后,它也不起作用。它编译并运行良好,但从未调用WhenCalled表达式。