2011-05-07 8 views
0

NUnit을 사용하여 애플리케이션을 테스트하고 있는데, 아래에 단순화 된 버전이 포함되어 있습니다. 모의 수업에서 이벤트를 발생시키고 테스트중인 클래스가 이벤트를 수신했는지 확인하는 방법을 찾고 있습니다.NUnit 모의 객체로 이벤트 테스트하기

응용 프로그램이 세션에서 LogIn을 호출하고 나중에 잠시 세션이 OnLoggedIn 이벤트를 시작합니다. 모의 세션을 설정하고 앱이 LogIn을 호출했는지 확인했습니다. 이제 OnLoggedIn 이벤트를 발생시키고 앱이이 이벤트를 처리하는지 확인합니다.

어떻게하면됩니까?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using NUnit.Framework; 
using NUnit.Mocks; 

namespace NUnitTest 
{ 
    public delegate void LoggedInDelegate(); 

    public interface ISession 
    { 
     void LogIn(String username, String password); 
     event LoggedInDelegate OnLoggedIn; 
    } 

    public class App 
    { 
     private bool loggedIn = false; 
     private ISession sess; 

     public bool LoggedIn 
     { 
      get 
      { 
       return loggedIn; 
      } 
     } 

     public App(ISession sess) 
     { 
      this.sess = sess; 
      sess.OnLoggedIn += HandleOnLoggedIn; 
     } 

     public void LogIn(String username, String password) 
     { 
      sess.LogIn(username, password); 
     } 

     public void HandleOnLoggedIn() 
     { 
      loggedIn = true; 
     } 
    } 

    [TestFixture] 
    public class AppTest 
    { 
     private String USERNAME = "Username"; 
     private String PASSWORD = "Password"; 

     private DynamicMock mockSess; 
     private App app; 

     [SetUp] 
     public void TestInit() 
     { 
      // Create objects. 
      mockSess = new DynamicMock(typeof(ISession)); 
      app = new App((ISession) mockSess.MockInstance); 
     } 

     [Test] 
     public void TestLogin() 
     { 
      mockSess.Expect("LogIn", USERNAME, PASSWORD); 
      app.LogIn(USERNAME, PASSWORD); 
      mockSess.Verify(); 

      mockSess.Call("OnLoggedIn"); 
      Assert.IsTrue(app.LoggedIn); 
     } 
    } 
} 

답변

1

이 기사를 사용해보십시오. https://web.archive.org/web/20110914180329/http://blog.gravityfree.ca/2007/03/raising-events-in-nmock-20.html. 나는 그것을 실제로 얻지 못했지만 같은 문제가 있기 때문에 앉아서 나중에 시도해 볼 것입니다.

나는 보통 oldfashioned 스텁 객체 (조롱 프레임 워크가 없음)를 만들고 스텁의 Method 호출을 통해 이벤트를 발생시킵니다. 그것은 이런 식입니다 :

[TestFixture] 
public sealed class TestStubbingEvents 
{ 
    [Test] 
    public void FooReceivesEventFromBar() 
    { 
     BarStub bar = new BarStub(); 
     Foo foo = new Foo(bar); 

     Assert.That(foo.EventReceived, Is.False); 
     bar.RaiseBarEvent(); 
     Assert.That(foo.EventReceived, Is.True); 
    } 

} 

internal class Foo 
{ 

    public bool EventReceived 
    { 
     get; set; 
    } 

    public Foo(IBar bar) 
    { 
     EventReceived = false; 
     bar.BarEvent += ReceiveBarEvent; 
    } 

    private void ReceiveBarEvent(object sender, EventArgs args) 
    { 
     EventReceived = true; 
    } 

} 

internal class BarStub : IBar 
{ 
    public event BarEventHandler BarEvent; 

    //Stub method that invokes the event 
    public void RaiseBarEvent() 
    { 
     BarEvent.Invoke(this, new EventArgs()); 
    } 
} 


public delegate void BarEventHandler(object sender, EventArgs args); 

public interface IBar 
{ 
    event BarEventHandler BarEvent; 
} 

이 내가 가지고 올 것 중에 최고입니다, 그래서 링크에있는 문서를 생성 할 수 있는지에 관심이 있습니다.

추가 :
주, 푸 클래스에 EventReceived 속성은 이벤트가 객체에 영향을 미치는 방법에 단지 예이다.

+0

이것은 좋은 솔루션이므로 엄격하게 질문에 일치하지는 않지만이를 받아 들였습니다. 링크가 NUnit-mock이 아닌 NMock2 프레임 워크를 사용합니다. 결국 Moq 프레임 워크를 사용하여 작업하기가 훨씬 쉬워졌습니다. –

관련 문제