在 FakeItEasy 7.0 中配置严格的假强制事件订阅
Strict fake forces event subcriptions to be configured in FakeItEasy 7.0
当我对事件处理程序订阅使用严格伪造时,这些被报告为未在 FakeItEasy 7.0 中配置。
- fake严格时抛出异常-'Call to unconfigured method of strict fake: IFoo.add_MyEvent(value: System.EventHandler)'.
- 我可以取消注释 A.CallTo 配置。但是后来测试没有通过。使用 MustHaveHappened 而不是 DoesNothing 会带来另一个异常 - 'Expected to find it once or more but no calls were made to the fake object'.
- 当我删除严格配置并让配置注释时,测试通过。
如何配置fake严格,同时处理事件?
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;
}
你可以这样做:
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:实际上, 已经预料到重大变化,我只是忘记了它。我提出的解决方法实际上是in the documentation
当我对事件处理程序订阅使用严格伪造时,这些被报告为未在 FakeItEasy 7.0 中配置。
- fake严格时抛出异常-'Call to unconfigured method of strict fake: IFoo.add_MyEvent(value: System.EventHandler)'.
- 我可以取消注释 A.CallTo 配置。但是后来测试没有通过。使用 MustHaveHappened 而不是 DoesNothing 会带来另一个异常 - 'Expected to find it once or more but no calls were made to the fake object'.
- 当我删除严格配置并让配置注释时,测试通过。
如何配置fake严格,同时处理事件?
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;
}
你可以这样做:
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:实际上, 已经预料到重大变化,我只是忘记了它。我提出的解决方法实际上是in the documentation