繁体   English   中英

Rhino Mocks,设置存根属性后如何执行操作

[英]Rhino Mocks, how can I perform an action after setting a Stub property

我有一个简单的要求,但是我似乎很挣扎。

我创建了一个stub来模拟包含Propertyinterface

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM