[

](iisprey.medium.com/?source=pos…)
6月19日
-
6分钟阅读
[
拯救

第2部分:Mocktail - 什么是测试中的Mocking?
Flutter测试简约指南 - 第二部分 嘲讽
在我们开始写测试之前,我想,我们需要学习如何模拟他们,这是一个重要的话题,我们需要经常使用
[
Flutter中的测试简明指南 - 第一部分 什么是测试?
这一次,我将开始深入地介绍Flutter中的测试!
itnext.io
基本上,我们在 Flutter 中有两个主要的软件包选择
- Mockito
- 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个主要步骤!
(暂时忘记init 和dispose 的步骤!)
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
第二部分 - 什么是Mocking?- 当前!
- 第3部分 - 单元测试 - 即将推出
- 第4部分 - 小工具测试 - 即将发布
- 第5部分 - 集成测试 - 即将发布
- 第6部分 - 自动化测试 - 即将发布
- 第七部分 - TDD - 即将发布
- 第8部分 - BDD - 即将发布
- 第九部分 - 代码覆盖率 - 即将发布
参考文献
[
Flutter单元测试 - 初学者指南
单元测试是自动化测试过程的一部分,在这个过程中对小单元的代码进行测试
betterprogramming.pub
](betterprogramming.pub/flutter-uni…)
谢谢您的阅读!
我试图创建尽可能简单的例子。希望你喜欢它。
如果你喜欢这篇文章,请点击👏按钮(你知道你可以加到50个吗?)
还有最后一件事!帮个忙,给你和我来杯咖啡吧
和我一起加入Medium!
另外,你知道吗,如果你用我的推荐链接成为会员,Medium也会给我一杯咖啡!这是个双赢的结果。为了实现这一双赢,请点击以下链接!