2014-09-05 87 views
3

我正在使用測試驅動開發在Mac OS X上使用Xamarin Studio開發一個簡單的應用程序。我使用NUnit作爲測試工具和FakeItEasy進行嘲弄。我開發了一個觸發事件的對象,並且我想測試另一個對該事件的對象響應,但是似乎響應對象從未接收到任何在測試中觸發的事件。無法從FakeItEasy mock中觸發事件在單元測試中

下面的代碼說明了這個問題:

using System; 
using NUnit.Framework; 
using FakeItEasy; 

namespace EventTest 
{ 
    public class EventProvider 
    { 
     public delegate void EventDelegate(object sender, EventArgs arguments); 

     public EventDelegate Event; 
    } 

    class EventResponder 
    { 
     public EventResponder(EventProvider provider) 
     { 
      provider.Event += (sender, arguments) => ++EventCount; 
     } 

     public uint EventCount { get; private set; } 
    } 

    [TestFixture] 
    public class EventResponderTest 
    { 
     [Test] 
     public void ResponseToFiredEvent() 
     { 
      var eventProvider = A.Fake<EventProvider>(); 

      EventResponder responder = new EventResponder(eventProvider); 

      eventProvider.Event += Raise.WithEmpty().Now; 
      eventProvider.Event += Raise.WithEmpty().Now; 
      eventProvider.Event += Raise.WithEmpty().Now; 

      Assert.AreEqual(3, responder.EventCount); 
     } 
    } 
} 

測試失敗,因爲EVENTCOUNT爲0怎樣才能讓這個測試通過了嗎?

回答

1

您的測試不起作用,因爲FakeItEasy需要僞造的成員是虛擬的,或者更一般地說是可覆蓋的,並且the same holds for events that FakeItEasy raises。您目前的活動不可覆蓋。爲了解決這個問題,或者:

  • 變化Event成員背後接口虛擬(public virtual event EventDelegate Event;
  • 隱藏EventProvider實施,假冒的接口,而不是類,並讓你的消費者(EventResponder)所依賴的接口而不是
+0

@BlairConrad:如果框架**在遇到這種情況時發出警告/拋出(試圖模擬由於DynamicProxy限制而無法解決的問題),那將非常好。 IME,我已經回答了與這個問題有關的大量問題,這證明這對初學者來說並不是顯而易見的話題。 – 2014-09-05 10:19:38

+0

在很多情況下(儘可能多的情況下),當我們試圖嘲笑那些不可嘲弄的東西時,FakeItEasy會被拋棄。嘗試在非虛擬方法上運行'A.CallTo'。有一個很好的錯誤。我相信有些地方是錯過的,但是當我們聽到這樣的事情時,我們試圖添加明確的錯誤。 在這裏,我沒有看到它是如何可能的 - 根本沒有假對象。 'Raise'沒有任何虛假的工作,並且'EventResponder'在測試中沒有被僞造。如果你有不同的想法,並有時間和傾向去調查,@ jimmy_keen,請找到一種方法;我希望有機會改善這裏的行爲。 – 2014-09-05 10:24:10

+0

我不確定如何讓Event成員變爲虛擬。當我嘗試將其更改爲: public virtual EventDelegate Event; 編譯時出現此錯誤: 修飾符'虛擬'對此項無效。 如果我嘗試類似: public EventDelegate virtual Event; 我得到這個編譯器錯誤: 意外的sybmol';'在類,結構或接口成員聲明 – 2014-09-06 17:02:21

相關問題