我在理解以下代码未通过的原因时遇到了一些麻烦:
test.py
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
的结果。为什么assert_called_with
的{{1}}测试失败?我相信我在正确的位置嘲笑Bar.add
(我在嘲笑Bar
,因为这是查找它的名称空间,而不是foo.Bar
)。
追踪(最近一次通话): 文件“/Users/iain/PycharmProjects/testing/venv/lib/python2.7/site-packages/mock.py”,第1201行,已修补 return func(* args,** keywargs) 在test_a_b中输入第12行的“test.py” fake_Bar.add.assert_called_with(2,2) 在assert_called_with中输入文件“/Users/iain/PycharmProjects/testing/venv/lib/python2.7/site-packages/mock.py”,第831行 引发AssertionError('预期调用:%s \ n不要调用'%(expected,)) AssertionError:预期调用:add(2,2) 不叫
答案 0 :(得分:9)
你在正确的地方嘲笑方法调用。但是,由于您是从实例调用该方法,因此它是一个绑定方法,因此除了所有其他参数外,还接收实例作为第一个参数(self
参数)。
修改:由于Bar
替换为Mock
实例,Bar().add
不知道它是一种方法(因此不受任何约束)。换句话说,Bar
是Mock
,Bar()
是Mock
,Bar().add
也是Mock
。因此,bar.add
是一个新创建的模拟,使用参数(2, 2)
调用。断言此调用的一种方法是:
@mock.patch('foo.Bar')
def test_foo_add(self, Bar):
foo = Foo()
foo.add(2, 2)
Bar.return_value.add.assert_called_with(2, 2)
根据实际代码的外观,您可能希望改为模拟方法而不是类:
@mock.patch('foo.Bar.add')
def test_foo_add(self, bar_add):
foo = Foo()
foo.add(2, 2)
bar_add.assert_called_with(2, 2)
答案 1 :(得分:0)
我相信你的问题会像这样解决:
from bar import Bar
class Foo(object):
def add(self, x, y):
self.bar = Bar()
return self.bar.add(x, y)