【问题标题】:Using FakeItEasy to assert that an event was raised使用 FakeItEasy 断言事件已引发
【发布时间】:2015-01-30 20:22:30
【问题描述】:

我可以执行以下操作来验证我的 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);
    }
}

我想知道是否有更“Mocking Framework-y”的方式来做到这一点。像下面这样的东西会很好:

        var service = A.Fake<IService>();
        var consumer = new Consumer(service);

        service.SomethingBadHappened += Raise.WithEmpty();

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

【问题讨论】:

    标签: .net unit-testing events mocking fakeiteasy


    【解决方案1】:

    为了让 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 timescertain arguments

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

    A.CallTo(handler).MustHaveHappened();
    

    【讨论】:

      猜你喜欢
      • 2012-01-25
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多