跳转到主要内容

最简单的模拟库

项目描述

许可 & 协作

MiniMock是由Ian Bicking编写的,Mike Beachy做出了重大贡献,并由Low Kian Seong维护。它采用MIT风格的许可

该项目有一个GitHub仓库,您可以使用以下命令克隆:git clone https://github.com/lowks/minimock.git。此外,还有一个Google Group用于开发邮件列表,您可以通过minimock-dev@googlegroups.com发送邮件。

简介

minimock是一个用于使用doctest进行Mock对象操作的简单库。当使用doctest时,mock对象可以非常简单。

以下是一个可能要测试的示例,一个简单的邮件发送者

>>> 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()

现在我们想要创建一个mock的smtplib.SMTP对象。我们得将我们的mock注入到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()

哇!我们隐式地测试了对象上没有调用任何意外的方法。我们还测试了mock对象获得的参数。我们提供了假的返回调用(用于smtplib.SMTP()构造函数)。这些都是mock库的核心部分。实现简单,因为大部分工作都是由doctest完成的。

控制模拟

Mock对象有几个属性,您可以在实例化对象时设置它们。为了避免名称冲突,所有属性都以前缀mock_开始,而构造函数参数则没有。

name:

对象名称,用于打印消息。在上述示例中是'smtplib.SMTP'

returns:

当此对象被调用时,将返回此值。默认为None。

returns_iter:

或者,您也可以提供一个返回结果的迭代器,例如returns_iter=[1, 2, 3];在后续调用中,它将返回下一个值。

returns_func:

如果给定,这将被调用以获取返回值。本质上,这个函数将是方法的真实实现。

raises:

当此对象被调用时将引发的异常(实例或类)。

tracker:

每次mock对象被调用或其上设置属性时(假设show_attrsTrue),都会通知此对象;默认为输出到标准输出的Printer。对于非doctest测试,TraceTracker可能更有用。传递None将禁用此行为。

show_attrs:

如果此值为true,则每次在mock对象上设置新属性时,都会通知tracker。否则属性设置是静默的,只有调用才会触发通知。

要创建一个始终引发ValueError的对象,请这样做

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

创建模拟

mock对象的每个属性本身也将是另一个mock对象,除非您明确将其设置为其他内容。例如,您可以这样做

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

然后,CONSTANT值将持久存在。但您也可以遍历到您想要的任何对象,您将得到另一个mock对象。

创建mock对象的另一种技术是mock(...)函数。这就像

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

这查找os.path.isfile对象,并将其更改为mock对象。您提供的任何关键字参数(如本例中的returns=True)都将用于创建mock对象;您还可以提供mock_obj关键字参数来传递您已创建的mock对象。

此函数会查找调用函数以确定要替换的内容(例如,本例中的os.path.isfile)。您必须首先导入正确的模块。或者,您可以传递一个如[locals(), globals()]的字典,以便它使用查找。

要恢复使用mock()模拟的所有对象,请使用minimock.restore()(无参数;所有mock都被跟踪)。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

MiniMock-1.2.8.tar.gz (13.2 kB 查看哈希值)

上传时间

构建分发

MiniMock-1.2.8-py2-none-any.whl (13.9 kB 查看哈希值)

上传时间 Python 2

支持者