2010-03-29 14 views
0

我試圖編寫一個單元測試,將引發我的測試類綁定到一個模擬對象上的事件。如何測試如果引發事件導致一個方法被稱爲條件的參數值

我熱衷於測試,但是當我的測試類獲取其eventhandler調用時,它應該只調用eventhandler參數的某些值的方法。

即使我評論調用ProcessPriceUpdate(price)的代碼,我的測試似乎也會通過;

我在VS2005所以沒有lambda表達式請:(

所以......

public delegate void PriceUpdateEventHandler(decimal price); 

public interface IPriceInterface{ 
    event PriceUpdateEventHandler PriceUpdate; 
} 

public class TestClass 
{ 
    IPriceInterface priceInterface = null; 

    TestClass(IPriceInterface priceInterface) 
    { 
     this.priceInterface = priceInterface; 
    } 

    public void Init() 
    { 
     priceInterface.PriceUpdate += OnPriceUpdate; 
    } 

    public void OnPriceUpdate(decimal price) 
    { 
     if(price > 0) 
      ProcessPriceUpdate(price); 
     } 

    public void ProcessPriceUpdate(decimal price) 
    { 
     //do something with price 
    } 
} 

到目前爲止我的測試...:■

public void PriceUpdateEvent() 
    { 
     MockRepository mock = new MockRepository(); 
     IPriceInterface pi = mock.DynamicMock<IPriceInterface>(); 
     TestClass test = new TestClass(pi); 

     decimal prc = 1M; 

     IEventRaiser raiser; 

     using (mock.Record()) 
     { 
      pi.PriceUpdate += null; 

      raiser = LastCall.IgnoreArguments().GetEventRaiser(); 

      Expect.Call(delegate { test.ProcessPriceUpdate(prc); }).Repeat.Once(); 

     } 
     using (mock.Playback()) 
     { 
      test.Init(); 
      raiser.Raise(prc); 
     } 
    } 

回答

0

我通常會首先驗證觸發事件是否會調用適當的回調函數(並且該回調函數總是被調用,而不是條件函數)。您試圖測試的條件邏輯進入應用程序ropriate回調,通過額外的單獨測試進行測試。

第一個測試可以通過從被測試的類中創建一個派生類來實現,並使用適當的回調重寫來簡單地記錄它被成功調用。然後當你觸發事件時,你可以驗證回調被調用。

下一步是直接測試回調方法,就像您使用其他方法一樣。

下面是一個包含第一次測試所需驗證代碼的框架測試。需要注意的是OnPriceUpdate將在TestClass中進行虛擬:

public class TestClass_verifiesCallback : TestClass 
{ 
    public bool WasCallbackCalled = false; 
    public decimal PricePassedToCallback = 0; 

    public override void OnPriceUpdate(decimal price) 
    { 
     WasCallbackCalled = true; 
     pricePassedToCallback = price; 
    } 
} 

... test methods 

public TestInitSetsPriceUpdateCallback() 
{ 
    .. setup 

    var sut = new TestClass_verifiesCallback() 

    .. run test 

    // verification: 
    Assert.IsTrue(sut.WasCallbackCalled); 
    Assert.AreEqual(expectedValue, sut.PricePassedToCallback); 
} 

你以後的測試可以直接測試OnPriceUpdate。

+0

有一點代碼可以說明。我想我明白你的意思,但是一小段代碼真的會有幫助。 :) – MattC 2010-03-30 09:28:56

相關問題