Mock源码阅读

栏目: Python · 发布时间: 5年前

内容简介:写单元测试的时候,经常要借助Mock来完成某些替换,鉴于Python的动态性,Python中 写单元测试还是很方便的。但是需要吐槽的是,也是因为Python的动态性,Python的功能 必须要由高覆盖率的测试来保证。看完mock的代码感觉有两点:

写单元测试的时候,经常要借助Mock来完成某些替换,鉴于 Python 的动态性,Python中 写单元测试还是很方便的。但是需要吐槽的是,也是因为Python的动态性,Python的功能 必须要由高覆盖率的测试来保证。

Mock源码以及注释

https://github.com/jiajunhuang/cpython/blob/annotation/Lib/unittest/mock.py

感受

看完mock的代码感觉有两点:

  • 标准库的代码并不是那么“标准” --- 并不怎么遵守pep8

  • 标准库的代码测试覆盖率超高

看完mock的代码以后给CPython提交了两个patch,一个是优化了一下写法,一个是修复了 一个bug:

造个小轮子

简单实现一个mock如下:

class Mock:
    return_value = NotImplemented

    def __new__(cls, *args, **kwargs):
        new = type(cls.__name__, (cls, ), {'__doc__': cls.__doc__})
        return object.__new__(new)

    def __init__(self, return_value):
        self.return_value = return_value

    def __call__(self):
        return self.return_value if self.return_value else None


class PatchObject:
    def __init__(self, instance, attr_name, value):
        self.attr_origin = getattr(instance, attr_name, None)
        self.attr_name = attr_name
        self.instance = instance
        self.value = value

    def __enter__(self):
        """perform the patch"""
        mocked = Mock(self.value)
        setattr(self.instance, self.attr_name, mocked)
        return mocked

    def __exit__(self, exc_type, exc_val, exc_rb):
        """unpatch"""
        if self.attr_origin:
            setattr(self.instance, self.attr_name, self.attr_origin)
        else:
            delattr(self.instance, self.attr_name)


if __name__ == "__main__":
    # test mock
    class Foo:
        def foo(self):
            pass

    foo = Foo()
    foo.foo = Mock(1)

    bar = Foo()
    bar.foo = Mock(2)

    print(foo.foo(), bar.foo())

    # test patch object
    baz = Foo()
    with PatchObject(baz, "baz", 3) as mocked_baz:
        print(mocked_baz())
    print(dir(baz))

运行结果:

(1, 2)
3
['__doc__', '__module__', 'foo']

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

社交网站的数据挖掘与分析

社交网站的数据挖掘与分析

Matthew A. Russell / 师蓉 / 机械工业出版社 / 2012-2 / 59.00元

Facebook、Twitter和LinkedIn产生了大量宝贵的社交数据,但是你怎样才能找出谁通过社交媒介正在进行联系?他们在讨论些什么?或者他们在哪儿?这本简洁而且具有可操作性的书将揭示如何回答这些问题甚至更多的问题。你将学到如何组合社交网络数据、分析技术,如何通过可视化帮助你找到你一直在社交世界中寻找的内容,以及你闻所未闻的有用信息。 每个独立的章节介绍了在社交网络的不同领域挖掘数据的......一起来看看 《社交网站的数据挖掘与分析》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具