【问题标题】:Rhino Mocks, how can I perform an action after setting a Stub propertyRhino Mocks,设置存根属性后如何执行操作
【发布时间】:2012-05-21 14:59:03
【问题描述】:

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

我创建了一个 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;

【问题讨论】:

  • 你可能想要GenerateMock而不是GenerateStub
  • 所以你想在设置Id属性的时候执行代码?
  • 是的,我确实想在 setter 中执行代码
  • GenerateMock 不起作用。当我设置属性时,什么也没有发生(它甚至没有设置属性 - 值保持在 0)
  • 想要在模拟/存根对象的设置器中执行代码的用例是什么?通常,存根/模拟是依赖项的简单替代品或占位符。如果您有需要在 setter 上执行的代码,那应该是实现接口的对象的单元测试的一部分。

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


【解决方案1】:

以下对我有用:

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

【讨论】:

    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多