最简单的模拟库

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方法来评估安卓中任何旨在提高性能的变化   java是模拟大量用户对web服务请求的好方法吗?   java在从中检索整数时遇到问题。性质   JBoss发布期间的java问题   java如何在安卓应用程序中运行重命名shell命令(根目录)   java JafaFX ListView更改单个单元格/项目/行的颜色   java Queue RingBuffer实现Queue12。不起作用   java Spring启动404未找到错误   从Java运行cygwin编译程序   java显示10椭圆时的新行   java Serenity报告屏幕截图不起作用   javascript如何从angularJS向java函数发送JSON数据   @ManyToMany连接的java订单结果列表   java为什么这里不遵循运算符优先级?   继承在Java中,子类可以继承哪些方法?   Eclipse RCP应用程序中的java动态语言切换   java是否需要同步ConcurrentHashMap<K,V>中只返回值作为对象的函数?   调用java可执行文件并捕获异常的Shell脚本