.net - 使用 FakeItEasy 断言已引发事件

标签 .net unit-testing events mocking fakeiteasy

我可以执行以下操作来验证 ErrorOccurred我的事件 Consumer类(class)提出:

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);
    }
}

我想知道是否有更多的“Mocking Framework-y”方式来做到这一点。像下面这样的东西会很好:
        var service = A.Fake<IService>();
        var consumer = new Consumer(service);

        service.SomethingBadHappened += Raise.WithEmpty();

        consumer.ErrorOccurred.MustHaveHappened(/*yada yada/*);

最佳答案

为了让 FakeItEasy 在方法上执行任何断言,该方法必须是可伪造的,并且定义在一个伪造的对象上。在这种情况下,consumer是一个“真实”的对象,所以 FakeItEasy 无法知道它是否做了任何事情。

有一个替代方案,但它是否更像是“Mocking Framework-y”还有待商榷。但它可能会吸引你。

创建一个假的(在本例中为 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被称为。可以进行简单的修改以确保调用是specific number of times。 ,或与 certain arguments .

当然,如果您不关心方法被调用的次数或参数,因为在 handler 上实际上只有一种方法感兴趣。 ,您可能会使用这个更简单的调用,它将匹配对处理程序的任何调用(可能是 Invoke ):
A.CallTo(handler).MustHaveHappened();

关于.net - 使用 FakeItEasy 断言已引发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28243986/

相关文章:

c# - 如果我选择不同的通用约束,为什么不能重载具有相同参数的方法?

php - 使用 vfsStream 将文件插入特定目录/节点

java - 对返回数组最小值的方法进行单元测试

python - 什么时候应该在 Python 中使用 'assert'?

javascript - 如何获取 self.location 更改事件?

.net - 迭代两个字符串之间的每个值

javascript - 如何在加载页面之前使用 javascript 附加请求 header

C# 左连接两个数据表

javascript - DOMContentLoaded 事件是否与 jQuery 的 .ready() 函数完全相同?

java - 哪个监听器可以知道 JTextPane 值已更改?