使用FakeItEasy来断言事件是否被触发

4
我可以执行以下操作来验证我的Consumer类的ErrorOccurred事件是否被触发:
using System;
using FakeItEasy;
using Microsoft.VisualStudio.TestTools.UnitTesting;

public interface IService
{
    event EventHandler SomethingBadHappened;
}

class Consumer
{
    private readonly IService service;

    public Consumer(IService service)
    {
        this.service = service;
        service.SomethingBadHappened += (sender, args) => RaiseErrorOccurred();
    }

    public event EventHandler ErrorOccurred;

    protected virtual void RaiseErrorOccurred()
    {
        var handler = ErrorOccurred;
        if (handler != null) handler(this, EventArgs.Empty);
    }
}

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        var service = A.Fake<IService>();
        var consumer = new Consumer(service);

        bool eventWasRaised = false;
        consumer.ErrorOccurred += (sender, args) => { eventWasRaised = true; };

        service.SomethingBadHappened += Raise.WithEmpty();

        Assert.IsTrue(eventWasRaised);
    }
}

我想知道是否有更符合“模拟框架”的方式来完成这项任务。以下内容类似于所期望的格式:
        var service = A.Fake<IService>();
        var consumer = new Consumer(service);

        service.SomethingBadHappened += Raise.WithEmpty();

        consumer.ErrorOccurred.MustHaveHappened(/*yada yada/*);
1个回答

10
为了让FakeItEasy对方法执行任何断言,该方法必须是可伪造的,并在虚假对象上定义。在此情况下,consumer 是一个“真实”的对象,因此 FakeItEasy 没有办法知道它是否做了任何事情。
还有一种选择,但它是否更符合“Mocking Framework”尚待争议。但它可能会吸引你。
创建一个虚假对象(在这种情况下为 handler)来侦听 ErrorOccurred 方法。
[TestMethod]
public void TestMethod2()
{
    var service = A.Fake<IService>();
    var consumer = new Consumer(service);

    var handler = A.Fake<EventHandler>();
    consumer.ErrorOccurred += handler;

    service.SomethingBadHappened += Raise.WithEmpty();

    A.CallTo(()=>handler.Invoke(A<object>._, A<EventArgs>._)).MustHaveHappened();
}

这样你就可以检查handler是否被调用。可以进行简单的修改以确保以特定次数特定参数进行调用。
当然,如果您不关心方法被调用的次数或参数,因为handler上真正感兴趣的只有一个方法,那么您可以使用这个更简单的调用,它将匹配任何对处理程序(可能是Invoke)的调用。
A.CallTo(handler).MustHaveHappened();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接