最简单的模拟库
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_attrs是True); 默认为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()(不带参数;保留所有模拟 跟踪)。