在Flutter中测试的简约指南 - 第二部分 嘲弄

351 阅读6分钟

[

Hasan Basri Bayat

](iisprey.medium.com/?source=pos…)

哈桑-巴斯里-巴亚特

关注

6月19日

-

6分钟阅读

[

拯救

](medium.com/m/signin?ac…)

第2部分:Mocktail - 什么是测试中的Mocking?

Flutter测试简约指南 - 第二部分 嘲讽

在我们开始写测试之前,我想,我们需要学习如何模拟他们,这是一个重要的话题,我们需要经常使用

[

Flutter中的测试简明指南 - 第一部分 什么是测试?

这一次,我将开始深入地介绍Flutter中的测试!

itnext.io

](itnext.io/minimalist-…)

基本上,我们在 Flutter 中有两个主要的软件包选择

  1. Mockito
  2. Mocktail

这两个包都很好,但我还是选择Mocktail

为什么我选择Mocktail?

不要误会我的意思,mockito也很好,而且是由飞镖团队自己开发的!但我只是喜欢mocktail的方式。但我只是喜欢mocktail的方式!因为。

  • 更简单的API
  • 没有代码生成

仅此而已!

为什么我们需要包,难道我们不能在没有任何包的情况下编写吗?

事实上,我们可以,但我认为这张图片可以很好地向你解释这种情况。

动机

即使在这个基本的例子中,你也能清楚地看到其中的差别!

无包装与模拟酒

除此之外,我们还需要为所有的场景编写所有这些代码!想想那个模板吧!

总之

什么是Mocking,我们为什么需要它?

"单元测试背后的主要想法是隔离和关注我们正在测试的当前单元,而不是外部依赖的行为。但在大多数情况下,我们需要依赖外部依赖,如DB、Web服务器、平台API、外部设备等。

让我们假设,我们当前的单元依赖于一个网络API。当服务器运行时,测试工作缓慢但很好。但当服务器处于离线状态时,单元测试就会失败。这使得该单元测试不可预测。因为网络服务器不在我们的控制范围内。当网络服务器宕机时,这不是我们的错。这就是嘲弄的作用"。

(我直接从这篇超赞的文章中复制了这2段话。因为我无法更好地解释它!请查看那篇文章,也为他鼓掌吧!)

所以,我们只是创建假的服务,将我们的测试与其他的依赖关系隔离开来,并且我们假设所有的外部依赖关系都能正常工作

你可能会认为,基本上;用原件替换/伪造依赖关系

-Tadas Petra

为什么我们不叫它们faking而不叫mocking呢?

实际上,我不知道主要的原因,但我想,假服务是指不同的事情。(就像在一个假的环境中工作)但如果我们用faking而不是mocking。术语会被混为一谈!IMHO。无论如何,这甚至都不重要!

另外,在测试你的应用程序时,你会看到这么多的 "存根 "术语!

什么是存根?

存根是一段代码,用来代替其他一些编程功能。一个存根可以模拟现有代码的行为

基本上,我们得到了这个类,并创建了一个假的类,看起来是一样的,但有不同的功能!

class Horse {}

这么多理论够了吗?

那么,让我们来看看我们的隐藏力量吧!!

逻辑很简单!

"对你的木马说,在每一种情况下该怎么做!并让它发生!并控制它是否正确完成了你的工作!"

// Stub the `sound` method.when(() => trojan.sound()).thenReturn('horse sound');

实际上,我们在测试时有3个主要步骤!

(暂时忘记initdispose 的步骤!)

1.安排--决定行为!

我们的妙语是when

"当那个方法运行时,就做这个!"

// Sync Methodswhen(() => service.syncMethod()).thenReturn('ehe');

2.行动--尝试!

这里没有特殊情况,我们只是运行这些方法!如果我们需要的话!

final res = service.syncMethod();

3.断言 - 确认它!

最后,我们确保工作正常!因此,我们定义我们的期望,并将其与结果进行比较!

// We make ensure that method never runned before!verifyNever(() => service.syncMethod());

你也可以随时轻松地重置你的服务!

并轻松开始你的下一次测试!

reset(service);

注意事项!

如果你想用参数匹配器使用你的自定义类型,你需要在开始时注册你的类型!因为Mocktail只支持开箱即用的原始类型!不过不用担心,这很容易做到!

class Food {...}

为什么我不能正确地存根/验证扩展方法?

我也是直接从文档中复制的,因为它很好地解释了这种情况!

"扩展方法不能被存根/验证,因为它们被当作静态方法对待。这意味着调用直接进入扩展方法而不关心实例。因此,对扩展的存根和验证调用总是会导致对真正的扩展方法的调用。

与其直接存根/验证扩展方法,不如在扩展方法与之交互的实例上存根/验证公共成员。"

class MyClass {}

"在上述情况下,调用 *foo* *MockMyClass*将总是调用真正的 *foo()*(而不是存根)。因此,不可能对作为扩展的方法进行存根/验证,因为它们总是会导致真正的扩展被调用。"

这就是我想说的关于嘲弄测试的全部内容

下周,我将开始讨论单元测试,并让我的手变脏!

第一部分 - 什么是测试?

[

Flutter测试的简约指南

这一次,我将开始深入地介绍Flutter中的测试!

itnext.io

](itnext.io/minimalist-…)

第二部分 - 什么是Mocking?- 当前!

  • 第3部分 - 单元测试 - 即将推出
  • 第4部分 - 小工具测试 - 即将发布
  • 第5部分 - 集成测试 - 即将发布
  • 第6部分 - 自动化测试 - 即将发布
  • 第七部分 - TDD - 即将发布
  • 第8部分 - BDD - 即将发布
  • 第九部分 - 代码覆盖率 - 即将发布

参考文献

[

Flutter单元测试 - 初学者指南

单元测试是自动化测试过程的一部分,在这个过程中对小单元的代码进行测试

betterprogramming.pub

](betterprogramming.pub/flutter-uni…)

谢谢您的阅读!

我试图创建尽可能简单的例子。希望你喜欢它。

如果你喜欢这篇文章,请点击👏按钮(你知道你可以加到50个吗?)

还有最后一件事!帮个忙,给你和我来杯咖啡吧

和我一起加入Medium!

另外,你知道吗,如果你用我的推荐链接成为会员,Medium也会给我一杯咖啡!这是个双赢的结果。为了实现这一双赢,请点击以下链接!