Python 2.7 mock/patch: 理解 assert_called_XYZ//

我是相对的新手 Python 和模块化测试 Python. 来自世界 48 我知道嘲笑的概念,但它看起来截然不同 45.

我发现这指南对我来说似乎非常有帮助:
http://www.voidspace.org.uk/python/mock/index.html
但是当我写下我的时候 /更复杂/ 用嘲弄依赖性测试,我注意到了一个奇怪的行为。
我决定创造一个减少,简单的例子,这也不起作用。

看看这一点,结果和我的期望是评论:


import unittest
from mock import patch, Mock, MagicMock

class BasicTest/unittest.TestCase/:

@patch/"StringIO.StringIO"/
def testSomethingNotWorkingAsExpected/self, StringIOMock/:
StringIOMock.assert_called_once// # asserts, but why?

@patch/"StringIO.StringIO"/
def testSomethingSomehowWorking/self, StringIOMock/:
# self.instantiateStringIO// # intentionally commented out
assert StringIOMock.called # does not assert /leading to failure of this test/; as expected. If the above line is not commented, this asserts as expected.

def instantiateStringIO/self/:
import StringIO
StringIO.StringIO//


为什么
assert_called_once//

批准复制
StringIO

, 即使他尚未创造出来?
为什么
assert ClassMock.called

带来预期的结果?

使用
assert not ...

有关该方法的批准未造成,我在这里找到:
https://coderoad.ru/12187122/
. 我在我的情况下转过这个模式,降低了
not

.

在某个地方我找到了一个模板
ClassMock.return_value

引用实例。 但我理解它是一种在调用之前操纵布局实例的方法,而不是作为访问可能由较低代码内部创建的实例的方法。 或者我错了?

我的周围:

Python 2.7.3

布局 0.8.8

Fedora. 19

可能是我对布局的了解/补丁,不正确。 任何人都可以熟练地解释什么是课堂布局以及它如何工作?

Edit1: 添加了输出

... 并补充说,释放括号以评论
testSomethingSomehowWorking


这是出路:


.F
======================================================================
FAIL: testSomethingSomehowWorking /test_test.BasicTest/
----------------------------------------------------------------------
Traceback /most recent call last/:
File "/usr/lib/python2.7/site-packages/mock.py", line 1224, in patched
return func/*args, **keywargs/
File "test_test.py", line 15, in testSomethingSomehowWorking
assert StringIOMock.called # does not assert; as expected
AssertionError

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED /failures=1/
已邀请:

冰洋

赞同来自:

方法
assert_called_once

不存在并且不批准。 它与写作不同
StringIOMock.assert_foo_bar_does_not_exist//

或任何其他方法。 布局库不检查是否实际上在布局上调用的方法。

如果您正在使用
http://www.voidspace.org.uk/py ... _with
, 正如预期的那样,它出现了秩序。

范围
spec

您可以在调用不存在的方法时使用错误:


@patch/"StringIO.StringIO", spec=StringIO.StringIO/
def testSomethingNotWorkingAsExpected/self, StringIOMock/:
StringIOMock.assert_called_once// # will fail as the method doesn't exist

要回复问题请先登录注册