Rhino Mocks,如何在设置Stub属性后执行操作

时间:2012-05-21 14:59:03

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

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

我创建了一个stub来嘲笑包含interface的{​​{1}}:

Property

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")); });

  

您正尝试在已定义为使用PropertyBehavior的属性上设置期望值。   而不是编写如下代码:mockObject.Stub(x =&gt; x.SomeProperty).Return(42);   您可以直接使用该属性来获得相同的结果:mockObject.SomeProperty = 42;

2 个答案:

答案 0 :(得分:3)

以下适用于我:

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。我不知道为什么。

答案 1 :(得分:2)

如果要验证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();