fakeiteasy - 在 FakeItEasy 7.0 中配置严格的假力事件订阅
问题描述
当我对事件处理程序订阅使用严格的假时,这些报告在 FakeItEasy 7.0 中未配置。
- 当 fake 是 strict 时,会抛出一个异常 - 'Call to unconfigured method of strict fake: IFoo.add_MyEvent(value: System.EventHandler)'。
- 我可以取消注释 A.CallTo 配置。但是后来测试没有通过。使用 MustHaveHappened 而不是 DoesNothing 会带来另一个异常——“预计会找到一次或多次,但没有调用假对象”。
- 当我删除严格配置并让配置注释时,测试通过。
我应该如何将假配置为严格,但同时处理事件?
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:实际上,已经预料到了重大变化,我只是忘记了它。我提出的解决方法实际上在文档中进行了描述
推荐阅读
- java - 我如何在 Spring 中使用 @CachePut 进行收集?
- python - 单元测试时如何从数据库异步获取记录?
- vb.net - VB.NET:是否有替代使用按位逻辑运算符在记录中查找匹配项的方法?
- amazon-web-services - Amazon Textract 在进行分析时会跳过一些表单字段
- javascript - 返回长度为偶数的 firstName 值的数量
- django - 您应该直接在视图中访问cleaned_data,还是拥有一个属于给定表单的方法来处理cleaned_data?
- java - 如何从模拟中返回 SftpFileInfo?Junit5 Java11 spring-集成
- python - 如何用 pd.Series 中的值替换它们的出现率?
- android - 在 Kotlin 中解决 ViewById 的问题 - android:id 不等于 view:id ?(新手问题)
- amazon-web-services - Amazon S3 分段上传:我可以将部分文件上传到分段吗?