c# - FakeItEasy 断言方法调用方法
问题描述
我有一个用FakeItEasy v2.2.0编写的单元测试。
测试测试一个方法,让它MethodA
调用MethodB
.
简单的类:
public class Foo
{
public virtual void MethodA()
{
MethodB();
}
public virtual void MethodB() { }
}
简单的测试:
var foo_fake = A.Fake<Foo>(options => options.CallsBaseMethods());
foo_fake.MethodA();
A.CallTo(() => foo_fake.MethodA()).MustHaveHappened()
.Then(A.CallTo(() => foo_fake.MethodB()).MustHaveHappened());
使用FakeItEasy 2.2.0,代码通过了。
但是当我们升级到5.1.0时,代码抛出异常:
已找到呼叫,但呼叫中的顺序不正确
当我们说方法被调用时?在执行开始时,还是在结束时?
或者,测试这种情况的正确方法是什么?
解决方案
调用MethodB
发生并在完成之前MethodA
完成。这解释了订单消息。它(FakeItEasy)记录在成员调用结束时调用。
为了证明我的观点,以下测试通过
A.CallTo(() => foo_fake.MethodB()).MustHaveHappened() //<-- Note MethodB checked first
.Then(A.CallTo(() => foo_fake.MethodA()).MustHaveHappened());
我建议以下
//Arrange
var foo_fake = A.Fake<Foo>(options => options.CallsBaseMethods());
Action<Foo> subject = foo => foo.MethodA();
//Act
subject(foo_fake);
//Assert
A.CallTo(() => foo_fake.MethodA()).MustHaveHappened();
A.CallTo(() => foo_fake.MethodB()).MustHaveHappened();
推荐阅读
- react-native - 不要在为 android 部署时使用按钮
- ionic-framework - Ionic 3 中的 SQLCipher
- php - Webhook 解析后 Gocardless 不执行程序
- python - 检查列表中的所有值是否大于某个数字 x 且小于 y?
- vue.js - 如何在主 vue 组件之外访问导入的 vue 组件的实例?
- ms-access - 如何远程连接到Access数据库?
- xcode - 将 SDK 设置为 12.1
- cmd - Azure Devops (VSTS) - 在控制台中以管理员身份启动构建代理(交互模式)
- javascript - 如何制作输出 html 的 wordpress 块?
- regex - 正则表达式:匹配第一次出现的: