模拟包周围的薄包装便于py.test使用
pytest-mock的Python项目详细描述
用法
mocker fixture的api与 mock.patch , 支持相同的参数:
deftest_foo(mocker):# all valid callsmocker.patch('os.remove')mocker.patch.object(os,'listdir',autospec=True)mocked_isfile=mocker.patch('os.path.isfile')
支持的方法有:
- mocker.patch
- mocker.patch.object
- mocker.patch.multiple
- mocker.patch.dict
- mocker.stopall
- mocker.reset all() :调用到目前为止所有模拟对象中的
为了方便起见,可以从 mocker 直接访问 mock 模块中的这些对象:
间谍
在所有情况下,间谍的行为都与原始方法完全相同,只是它允许使用 mock 它的特性,比如检索调用计数。它也适用于类和静态方法。
deftest_spy(mocker):classFoo(object):defbar(self):return42foo=Foo()mocker.spy(foo,'bar')assertfoo.bar()==42assertfoo.bar.call_count==1
存根
存根是一个接受任何参数的模拟对象,对于测试回调非常有用。 可能会在repr中传递一个要由构造的存根对象使用的名称(用于调试)。
deftest_stub(mocker):deffoo(on_something):on_something('foo','bar')stub=mocker.stub(name='on_something_stub')foo(stub)stub.assert_called_once_with('foo','bar')
改进了模拟调用断言错误的报告
这个插件monkeypatches模拟库来改进pytest的失败输出 通过隐藏内部回溯 模拟模块中的条目。
当 调用helper方法。此功能捕获在 方法,并使用py.test自己的高级断言 差异:
mocker = <pytest_mock.MockFixture object at 0x0381E2D0> def test(mocker): m = mocker.Mock() m('fo') > m.assert_called_once_with('', bar=4) E AssertionError: Expected call: mock('', bar=4) E Actual call: mock('fo') E E pytest introspection follows: E E Args: E assert ('fo',) == ('',) E At index 0 diff: 'fo' != '' E Use -v to get the full diff E Kwargs: E assert {} == {'bar': 4} E Right contains more items: E {'bar': 4} E Use -v to get the full diff test_foo.py:6: AssertionError ========================== 1 failed in 0.03 seconds ===========================
当使用多个/嵌套参数断言模拟调用并尝试 以快速看出区别。
此功能可能是安全的,但如果遇到任何问题,可以在 您的 pytest.ini 文件:
[pytest]mock_traceback_monkeypatch=false
请注意,使用 --tb=native选项会自动禁用此功能。潜在的 用于禁止来自 mock 模块的回溯条目的机制不适用于该选项 另外,由于异常链接,它在Python3.5上生成了令人困惑的消息
使用独立的"模拟"软件包
版本1.4.0中的新功能。
python 3用户可能希望使用pypi上发布的最新版本的模拟包。 而不是python发行版的版本。
[pytest]mock_use_standalone_module=true
这将强制插件导入mock而不是与 Python3.4+。注意,这个选项只在Python3+中使用,因为Python2用户只有 无论如何都要使用来自pypi的模拟包。