首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FakeItEasy断言方法调用方法

FakeItEasy断言方法调用方法
EN

Stack Overflow用户
提问于 2019-04-14 13:42:26
回答 2查看 819关注 0票数 3

我有一个用FakeItEasy v2.2.0编写的单元测试。

测试测试一个方法,让它调用MethodA调用MethodB

简单的课程:

代码语言:javascript
复制
public class Foo
{
    public virtual void MethodA()
    {
        MethodB();
    }

    public virtual void MethodB() { }
}

简单的测试:

代码语言:javascript
复制
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时,代码会抛出如下异常:

呼叫被找到,但在呼叫中没有按正确的顺序排列。

当我们说时,这个方法叫做?在行刑开始的时候还是在最后?

或者,怎样才是检验这个案子的正确方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-14 16:16:59

更新:这是一个错误,并且已经修复。从 FakeItEasy 5.1.1开始,这种行为已恢复到2.2.0中的状态。

我们记录下呼叫是在呼叫结束后发出的,所以在您的情况下,命令是

  • 执行methodA
  • 执行methodB
  • 记录methodB的发生
  • 记录methodA的发生

但是,在3.4.2中,我们向设置ref参数值掩盖用于验证调用的传入参数值。发布了修复程序。这将记录调用的“序列号”的点从CastleInvocationCallAdapter内移到FakeManager。前者会在调用methodA之前记录methodB的调用。

很遗憾这破坏了你的用例。我认为这种新的行为是一个错误,并在GitHub上创建了问题GitHub。

不过,就我个人而言,我会看一下测试(我认为测试比您在这里介绍的要复杂)。我会接受@Nikosi的建议,而不检查电话的顺序。知道它们都被调用(甚至仅仅是methodB被调用)可能就足够了。

票数 2
EN

Stack Overflow用户

发布于 2019-04-14 15:32:31

MethodB的调用发生并在MethodA完成之前完成。这就解释了订单信息。它(FakeItEasy)记录在成员调用结束时调用。

为了证明我的观点,下面的测试通过了

代码语言:javascript
复制
A.CallTo(() => foo_fake.MethodB()).MustHaveHappened() //<-- Note MethodB checked first
    .Then(A.CallTo(() => foo_fake.MethodA()).MustHaveHappened());

我建议如下

代码语言:javascript
复制
//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();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55675942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档