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怎樣才能讓這個測試通過了嗎?
@BlairConrad:如果框架**在遇到這種情況時發出警告/拋出(試圖模擬由於DynamicProxy限制而無法解決的問題),那將非常好。 IME,我已經回答了與這個問題有關的大量問題,這證明這對初學者來說並不是顯而易見的話題。 – 2014-09-05 10:19:38
在很多情況下(儘可能多的情況下),當我們試圖嘲笑那些不可嘲弄的東西時,FakeItEasy會被拋棄。嘗試在非虛擬方法上運行'A.CallTo'。有一個很好的錯誤。我相信有些地方是錯過的,但是當我們聽到這樣的事情時,我們試圖添加明確的錯誤。 在這裏,我沒有看到它是如何可能的 - 根本沒有假對象。 'Raise'沒有任何虛假的工作,並且'EventResponder'在測試中沒有被僞造。如果你有不同的想法,並有時間和傾向去調查,@ jimmy_keen,請找到一種方法;我希望有機會改善這裏的行爲。 – 2014-09-05 10:24:10
我不確定如何讓Event成員變爲虛擬。當我嘗試將其更改爲: public virtual EventDelegate Event; 編譯時出現此錯誤: 修飾符'虛擬'對此項無效。 如果我嘗試類似: public EventDelegate virtual Event; 我得到這個編譯器錯誤: 意外的sybmol';'在類,結構或接口成員聲明 – 2014-09-06 17:02:21