首页 > 解决方案 > 在 FakeItEasy 7.0 中配置严格的假力事件订阅

问题描述

当我对事件处理程序订阅使用严格的假时,这些报告在 FakeItEasy 7.0 中未配置。

我应该如何将假配置为严格,但同时处理事件?

var foo = A.Fake<IFoo>(c => c.Strict());
A.CallTo(foo).Where(call => call.Method.Name == "add_MyEvent").MustHaveHappened();
var bar = new Bar(foo);
foo.MyEvent += Raise.With(foo, new EventArgs());
Assert.That(bar.EventCalled, Is.True);

public interface IFoo
{
    event EventHandler MyEvent;
}

public class Bar
{
    public Bar(IFoo foo)
    {
        foo.MyEvent += (o, s) => { EventCalled= true;};
    }

    public bool EventCalled { get; private set; } = false;
}

标签: fakeiteasy

解决方案


你可以这样做:

var foo = A.Fake<IFoo>(c => c.Strict());
EventHandler handler = null;
A.CallTo(foo).Where(call => call.Method.Name == "add_MyEvent")
    .Invokes((EventHandler value) => handler += value);
var bar = new Bar(foo);
handler?.Invoke(foo, EventArgs.Empty);
Assert.That(bar.EventCalled, Is.True);

请注意,当您手动处理事件订阅时,您不能再使用Raise来引发事件,但您可以手动调用委托。


编辑:FakeItEasy 6.x 不需要这种解决方法......看起来 7.0 引入了意外的重大更改。我会调查的。


EDIT2:实际上,已经预料到了重大变化我只是忘记了它。我提出的解决方法实际上在文档中进行了描述


推荐阅读