我正在使用测试驱动开发在Mac OS X上使用Xamarin Studio开发一个简单的应用程序。我使用NUnit作为测试工具,使用FakeItEasy进行模拟。我已经开发了一个触发事件的对象,我想测试另一个对象对该事件的响应,但似乎响应对象从未接收到任何在测试中触发的事件。
以下代码说明了问题:
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.如何使此测试通过?
答案 0 :(得分:2)
您的测试不起作用,因为FakeItEasy要求伪造的成员是虚拟的,或者更普遍的 - 可覆盖的the same holds for events that FakeItEasy raises。您当前的活动无法覆盖。要修复它,要么:
Event
成员更改为虚拟(public virtual event EventDelegate Event;
)EventProvider
实现,伪造界面而不是类,并使您的消费者(EventResponder
)依赖于界面