Python单元测试中mock一个返回generator的函数

Python函数可以通过返回generator的方法节约内存。所谓的返回generator,就是通过yield语句返回一系列的值。这些值只有在程序的返回结果被迭代(iterate)的情况下才会被真正返回。有关yield语句的工作原理和generator的详细解释在这篇文章中。在此不做详细讨论。

当我们使用yield来返回一个方法的执行结果时,实际上返回的是一个generator。而这个generator中的值只有在之后循环这个generator(例如使用for循环)时才会被真正返回。这个循环的过程实际上调用的是genereator__iter__函数。所以我们只要mock所返回的generator__iter__函数的返回值即可。可以使用MagicMock()或者mock.patch()来创建mock

如下面的例子所示:

例如我们有如下类需要测试:

class example(object):
    def func(self):
        yield from [1, 2, 3]

eg = example()
list(eg.func())

以上代码的执行结果如下:

[1, 2, 3]

那么我们mock该类及其func函数的方法如下,注意为了配置generator的返回值,我们实际上mockfunc函数所返回的generator__iter__()的返回值。

from mock import MagicMock


mock_example = MagicMock()
mock_example.func.return_value.__iter__.return_value = iter([1, 2, 3])
list(mock_example.func())

以上代码的执行结果如下:

[1, 2, 3]

可见我们成功的mock了一个返回generator的函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在此处先列下本篇文章的主要内容 简介 next方法的参数 for...of循环 Generator.prototy...
    醉生夢死阅读 1,482评论 3 8
  • 1.1==,is的使用 ·is是比较两个引用是否指向了同一个对象(引用比较)。 ·==是比较两个对象是否相等。 1...
    TENG书阅读 783评论 0 0
  • 本文作者就是我,简书的microkof。如果您觉得本文对您的工作有意义,产生了不可估量的价值,那么请您不吝打赏我,...
    microkof阅读 23,830评论 16 78
  • 简介 基本概念 Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同。本章详细介绍...
    呼呼哥阅读 1,133评论 0 4
  • 小朋友开始上幼儿园了,他说这是玩的幼儿园。原来读经典的私塾才是读幼儿园。前面一天还新奇,后面就开始有点情绪了。自由...
    c577eea5ec5b阅读 547评论 0 2

友情链接更多精彩内容