我有些困难理解以下代码为什么不能通过:
test.py
在代码中,
跟踪(Traceback)(最近的调用最先显示):
File "/Users/iain/PycharmProjects/testing/venv/lib/python2.7/site-packages/mock.py",第1201行,在修补程序(patched)中 return func(*args, **keywargs) File "test.py",第12行,在测试 a_b fake_Bar.add.assert_called_with(2, 2) File "/Users/iain/PycharmProjects/testing/venv/lib/python2.7/site-packages/mock.py",第831行,在 assert_called_with 中 raise AssertionError('Expected call: %s\nNot called' % (expected,)) 断言错误(AssertionError):期望的调用:add(2, 2)未被调用
import mock
import unittest
from foo import Foo
class TestFoo(unittest.TestCase):
@mock.patch('foo.Bar')
def test_foo_add(self, Bar):
foo = Foo()
foo.add(2, 2)
Bar.add.assert_called_with(2, 2)
if __name__ == '__main__':
unittest.main()
foo.py
from bar import Bar
class Foo(object):
def add(self, x, y):
bar = Bar()
return bar.add(x, y)
bar.py
class Bar(object):
def add(self, x, y):
print('b.Bar --> Adding {} + {}'.format(x, y))
return x + y
在代码中,
Foo.add
创建了一个 Bar
的实例,并在调用时返回 Bar.add
的结果。为什么对于 Bar.add
进行的 assert_called_with
测试失败?我认为我在正确的位置模拟了 Bar
(我正在模拟 foo.Bar
,因为它是被查找的命名空间,而不是 bar.Bar
)。跟踪(Traceback)(最近的调用最先显示):
File "/Users/iain/PycharmProjects/testing/venv/lib/python2.7/site-packages/mock.py",第1201行,在修补程序(patched)中 return func(*args, **keywargs) File "test.py",第12行,在测试 a_b fake_Bar.add.assert_called_with(2, 2) File "/Users/iain/PycharmProjects/testing/venv/lib/python2.7/site-packages/mock.py",第831行,在 assert_called_with 中 raise AssertionError('Expected call: %s\nNot called' % (expected,)) 断言错误(AssertionError):期望的调用:add(2, 2)未被调用
foo
作为第一个参数传递给Bar.add.assert_called_with()
,但测试仍然失败了?输出结果相同(AssertionError: Expected call: add(<foo.Foo object at 0x102108a50>, 2, 2) Not called) - Iainfoo.Bar
那么它的所有属性和方法都会保持原样,除非我明确地改变它们的行为。这种情况下是否应该使用mock.patch.object
方法呢? - Iainpatch.object
和patch
具有相同的功能;它们只是使用不同的引用方式来修补对象。要在foo
模块中修补Bar
,您可以使用mock.patch(foo, 'Bar')
,结果将是相同的。不幸的是,我不知道有没有预先构建的方法可以获得您想要的行为。 - Felipe