【问题标题】:Rhino Mocks - Raise Event When Property SetRhino Mocks - 设置属性时引发事件
【发布时间】:2011-05-11 10:57:34
【问题描述】:

每当使用 Rhino Mocks 设置某个属性时,我想在存根对象上引发一个事件。例如

public interface IFoo
{
   int CurrentValue { get; set; }
   event EventHandler CurrentValueChanged;
}

设置CurrentValue 将引发CurrentValueChanged 事件

我尝试了myStub.Expect(x => x.CurrentValue).WhenCalled(y => myStub.Raise...,但它不起作用,因为该属性是可设置的,并且它说我正在对已定义为使用 PropertyBehaviour 的属性设置期望。我也知道这是对WhenCalled 的滥用,我对此并不满意。

实现这一目标的正确方法是什么?

【问题讨论】:

    标签: c# rhino-mocks


    【解决方案1】:

    您很可能创建了一个存根,而不是一个模拟。唯一的区别是存根默认具有属性行为。

    所以完整的实现如下所示:

    IFoo mock = MockRepository.GenerateMock<IFoo>();
    // variable for self-made property behavior
    int currentValue;
    
    // setting the value: 
    mock
      .Stub(x => CurrentValue = Arg<int>.Is.Anything)
      .WhenCalled(call =>
        { 
          currentValue = (int)call.Arguments[0];
          myStub.Raise(/* ...*/);
        })
    
    // getting value from the mock
    mock
      .Stub(x => CurrentValue)
      // Return doesn't work, because you need to specify the value at runtime
      // it is still used to make Rhinos validation happy
      .Return(0)
      .WhenCalled(call => call.ReturnValue = currentValue);
    

    【讨论】:

    • 我无法相信需要做多少工作才能获得一些非常简单的行为。但令人惊讶的是,您的代码确实有效。谢谢!
    • @RichK:是的,这很复杂。我从来没有做过这样的设置。我想知道您是否真的需要这个,或者您是否滥用模拟框架来重建另一个组件的逻辑。
    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多