[英]Stub property setter with Rhino.Mocks to execute an action when called?
[英]Rhino Mocks, how can I perform an action after setting a Stub property
我有一个简单的要求,但是我似乎很挣扎。
我创建了一个stub
来模拟包含Property
的interface
:
public interface IMockIRuleRuningViewModel : IRuleRunningViewModel
{
int Id { get; set; }
}
mock
是:
var mock = MockRepository.GenerateStub<IMockIRuleRuningViewModel>();
现在,我想mock
一个我会为此Property
设置在设置器中的操作,这是我的尝试:
mock.Stub(x => x.Id).WhenCalled(
o =>
{
var engine = new RulesEngine(mock);
mock.ProcessRuleEngineResults(engine.RunRule("Id"));
});
但是我一直收到这个Exception
:
您试图对定义为使用PropertyBehavior的属性设置期望。 而不是编写这样的代码:mockObject.Stub(x => x.SomeProperty).Return(42); 您可以直接使用该属性来实现相同的结果:mockObject.SomeProperty = 42;
以下对我有用:
HttpResponseBase response = MockRepository.GenerateMock<HttpResponseBase>();
// stub the getter
response.Stub(r => r.StatusCode).Return((int)HttpStatusCode.OK);
// Stub the setter
response.Stub(r => r.StatusCode = Arg<int>.Is.Anything).WhenCalled( o =>
{
Console.WriteLine("called");
});
由于我实际上想做的是对可以获取但不设置状态代码的情况进行建模(因为已经发送了标头),所以我不执行WhenCalled()
,我这样做:
response.Stub(r => r.StatusCode = Arg<int>.Is.Anything)
.Throw(new HttpException("Server cannot set status after HTTP headers have been sent"));
您必须使用MockRepository.GenerateMock
而不是MockRepository.GenerateStub
。 我不知道为什么
如果要验证SUT(被测系统)的行为,则应使用具有适当期望值的模拟并进行验证。 如果您只想传递可能需要以某种方式起作用但不是此测试重点的值,则可以使用存根(存根不会导致测试失败)。
我假设您正在此测试中测试RulesEngine
(因为它只是我看到的真实对象)。 这是一个示例测试,它在执行“ Id”规则时验证引擎的行为:
// Arrange
var model = MockRepository.GenerateMock<IMockIRuleRuningViewModel>();
model.Expect(m => m.ProcessEngineResults(42));
RulesEngine engine = new RulesEngine(model);
// Act
engine.RunRule("Id");
// Assert
model.VerifyAllExpectations();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.