这可以通过以下方法完成:
myStub.Stub(x => x.SomeMethod()).WhenCalled(x => do something);
在调用属性设置器时,有什么方法可以做同样的事情吗?
答案 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,但是有过 在流畅的界面语法中没有富有表现力的构造。
具有特定值的属性设置期望被指定为 这样:
Expect.Call(mockedCustomer.Name).SetPropertyWithArguments( “Ayende”);
仅用于测试交互,属性设置期望 没有指定值的方式是这样做的:
Expect.Call(mockedCustomer.Name).SetPropertyAndIgnoreArguments();
这些新结构等于:
使用(mocks.Record()){mockedCustomer.Name =“Ayende”; //设置一个 期望设定一个特定的论点。
LastCall.IgnoreArguments(); //我们可以忽略这个论点 期望,给我们期望设定 财产,不论实际价值。 }