最简单的模拟库

MiniMock的Python项目详细描述


License & Collaboration

minimock通过Ian Bicking与 Mike Beachy的重大贡献,并由 低江城。它是根据MIT-style license授权的。

它有一个github repository 你可以用git clone https://github.com/lowks/minimock.git克隆它。 还有一个Google Group 有关开发邮件列表,请发送电子邮件至 minimock-dev@googlegroups.com

Introduction

minimock是一个使用doctest进行模拟对象的简单库。 使用doctest时,模拟对象可以非常简单。

下面是一个我们可以测试的示例,一个简单的电子邮件发件人:

>>> import smtplib
>>> def send_email(from_addr, to_addr, subject, body):
...     conn = smtplib.SMTP('localhost')
...     msg = 'To: %s\nFrom: %s\nSubject: %s\n\n%s' % (
...         to_addr, from_addr, subject, body)
...     conn.sendmail(from_addr, [to_addr], msg)
...     conn.quit()

现在我们要做一个模拟的smtplib.SMTP对象。我们必须 将我们的模拟注入smtplib模块:

>>> from minimock import Mock
>>> smtplib.SMTP = Mock('smtplib.SMTP')
>>> smtplib.SMTP.mock_returns = Mock('smtp_connection')

现在我们进行测试:

>>> send_email('ianb@colorstudy.com', 'joe@example.com',
...            'Hi there!', 'How is it going?')
Called smtplib.SMTP('localhost')
Called smtp_connection.sendmail(
    'ianb@colorstudy.com',
    ['joe@example.com'],
    'To: joe@example.com\nFrom: ianb@colorstudy.com\nSubject: Hi there!\n\nHow is it going?')
Called smtp_connection.quit()

喂!我们已经隐式测试,没有调用意外的方法 在物体上。我们还测试了模拟对象 得到了。我们提供了假返回调用(用于smtplib.SMTP() 建造商)。这些都是模拟库的核心部分。这个 实现很简单,因为大部分工作都是由doctest完成的。

Controlling Mocks

模拟对象有几个属性,所有这些属性都可以在 实例化对象。为了避免名称冲突,所有属性 以mock_开头,而构造函数参数不以mock_开头。

name
打印消息时使用的对象的名称。在 上面的例子是'smtplib.SMTP'
returns
调用此对象时,它将返回此值。默认情况下 没有。
returns_iter
或者,您可以给出一个iterable的返回结果,比如 returns_iter=[1, 2, 3];在随后的每次调用中,它都将返回 下一个值。
returns_func
如果给定,将调用此函数以获取返回值。在 本质上,这个函数将是 方法。
raises
出现以下情况时将引发的异常(实例或类) 对象被调用。
tracker
每次调用模拟对象时通知的对象,或 在其上设置了一个属性(假设show_attrsTrue); 默认为Printer到stdout。TraceTracker可以改为 对非博士测试有用。通过None禁用此行为。
show_attrs
如果为true,则每次在模拟上设置新属性时 对象将通知跟踪器。否则属性集是 无提示,仅调用触发通知。

因此,若要创建始终引发valueerror的对象,请执行以下操作:

>>> dummy_module = Mock('mylibrary')
>>> dummy_module.invalid_func.mock_raises = ValueError

Creating Mocks

模拟对象的每个属性本身都是另一个模拟对象, 除非你特别把它设置成别的。例如,你 可以做到:

>>> from minimock import Mock
>>> dummy_module = Mock('mylibrary')
>>> dummy_module.CONSTANT = 1

然后CONSTANT值将持续存在。但你也可以穿越 无论你想要什么样的对象,你都会得到另一个模拟对象。

另一种创建模拟对象的技术是mock(...) 功能。其工作原理如下:

>>> from minimock import mock
>>> import os.path
>>> mock('os.path.isfile', returns=True)

这将查找os.path.isfile对象,并将其更改为mock 反对。您提供的任何关键字参数(如 示例)将用于创建模拟对象;您还可以 mock_obj关键字参数,用于传入您已经 创建。

此函数在调用函数中查找 替换(os.path.isfile在示例中)。您必须导入 首先是正确的模块。或者你也可以像 [locals(),globals()]用于查找。

要还原用mock()模拟的所有对象,请使用 minimock.restore()(不带参数;保留所有模拟 跟踪)。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JavaFX TableView更新单元格,不更新对象值   在扫描器中使用分隔符的java   java OkHttp 4.9.2,连接无法重用,导致端口耗尽   eclipse中的c JNI:运行Java代码   java是否在出厂的所有硬件设备中都有/mnt/sdcard/Android/data文件夹(或等效文件夹)?   Java,在eclipse中访问资源文件夹中的图像   java为什么Bluemix dashDB操作抛出SqlSyntaxErrorException,SQLCODE=1667?   JavaHtmlUnitWebClient。getPage不处理javascript   Google API认证的java问题   java如何将JSON数组反序列化为Apache beam PCollection<javaObject>   ServerSocket停止接收命令,java/安卓   来自Java类的安卓 Toast消息   java如何自动重新加载应用程序引擎开发服务器?   java是否可以尝试/捕获一些东西来检查是否抛出了异常?   java如何做到这一点当我按下load game时,它不仅会加载信息,还会将您带到游戏中?   Java选项Xmx代表什么?   Java映射,它在插入时打印值   设置“ulimit c unlimited”后,java无法生成系统核心转储