2008-09-29 2 views
4

이벤트를 발생시키는 테스트 대상 개체가 있습니다. Rhino Mock을 사용하여 Rhino Mock이 올라 갔는지 확인하는 가장 좋은 방법은 무엇입니까?Rhino Mocks, MbUnit : 개체가 이벤트를 발생 시켰는지 확인하는 가장 좋은 방법입니다.

베스트 나는 (내가 이것보다 더 좋아진다 확신)와 함께 올 수 :

public void MyCallback(object sender, EventArgs e) { _flag = true;} 

[Test] 
public void DoSomethingRaisesEvent() { 
    _flag = false; 
    using(_mocks.Record()) { 
    Expect.Call(delegeate { _obj.DoSomething();}); 
    } 
    using(_mocks.Playback()) { 
    _obj = new SomethingDoer(); 
    _obj.SomethingWasDoneEvent += new EventHandler(MyHandler); 
    Assert.IsTrue(_flag); 
    } 
} 

답변

0

나는 테스트가 실제로 해봐요() 메서드를 호출하는 방법을 모르겠어요. 어쩌면 당신은 그 사건을 해고 할 뭔가를 놓쳤을 것입니다.

[Test] 
public void MyEventTest() 
{ 

    IEventRaiser eventRaiser; 

    mockView = _mocks.CreateMock<IView>(); 
    using (_mocks.Record()) 
    { 
     mockView.DoSomethingEvent += null; 
     eventRaiser = LastCall.IgnoreArguments(); 
    } 
    using (_mocks.Playback()) 
    { 
     new Controller(mockView, mockModel); 
     eventRaiser.Raise(mockView, EventArgs.Empty); 
    } 
} 
+0

내가 사울을 이해 모르겠지만, 당신은 명시 적으로 이벤트를 트리거 여기에 보인다 . Wheras 뭔가를하는 동안 객체가 암시 적으로 이벤트를 트리거했는지 테스트하려고합니다. –

5

내가 this article by Phil Haack on how to test events using anonymous delegates

을 발견보다 다른, 나는 당신이 어떤 경우 코뿔소 모의 객체와

을 이벤트를 테스트하기 위해 올바른 궤도에 있다고 생각, 여기에 내가 이벤트를 처리하고자하는 또 다른 방법입니다 다음

코드는, 클릭을 통해 너무 게으른 사람들을 위해 자신의 블로그에서 직접 찢어 수 있습니다 :

[Test] 
public void SettingValueRaisesEvent() 
{ 
    bool eventRaised = false; 
    Parameter param = new Parameter("num", "int", "1"); 
    param.ValueChanged += 
     delegate(object sender, ValueChangedEventArgs e) 
     { 
      Assert.AreEqual("42", e.NewValue); 
      Assert.AreEqual("1", e.OldValue); 
      Assert.AreEqual("num", e.ParameterName); 
      eventRaised = true; 
     }; 
    param.Value = "42"; //should fire event. 

    Assert.IsTrue(eventRaised, "Event was not raised"); 
}