在单元测试中无法从FakeItEasy模拟中触发事件

时间:2014-09-05 04:37:29

标签: c# unit-testing events fakeiteasy

我正在使用测试驱动开发在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.如何使此测试通过?

1 个答案:

答案 0 :(得分:2)

您的测试不起作用,因为FakeItEasy要求伪造的成员是虚拟的,或者更普遍的 - 可覆盖的the same holds for events that FakeItEasy raises。您当前的活动无法覆盖。要修复它,要么:

  • Event成员更改为虚拟(public virtual event EventDelegate Event;
  • 在界面后隐藏EventProvider实现,伪造界面而不是类,并使您的消费者(EventResponder)依赖于界面