Iai*_*ain 4 python unit-testing mocking
我在理解以下代码未通过的原因时遇到了一些麻烦:
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()
Run Code Online (Sandbox Code Playgroud)
foo.py
from bar import Bar
class Foo(object):
def add(self, x, y):
bar = Bar()
return bar.add(x, y)
Run Code Online (Sandbox Code Playgroud)
bar.py
class Bar(object):
def add(self, x, y):
print('b.Bar --> Adding {} + {}'.format(x, y))
return x + y
Run Code Online (Sandbox Code Playgroud)
在代码中,Foo.add创建一个实例Bar并返回Bar.add调用时的结果.为什么测试assert_called_with的Bar.add失败?我相信我Bar在正确的位置嘲笑(我在嘲笑,foo.Bar因为这是它被查找的命名空间,而不是bar.Bar).
回溯(最近一次调用最后一次):文件"/Users/iain/PycharmProjects/testing/venv/lib/python2.7/site-packages/mock.py",第1201行,修补返回函数(*args,**keywargs )文件"test.py",第12行,在test_a_b中fake_Bar.add.assert_called_with(2,2)文件"/Users/iain/PycharmProjects/testing/venv/lib/python2.7/site-packages/mock.py" ,第831行,在assert_called_with中引发AssertionError('预期调用:%s \n不称为'%(期望))AssertionError:预期调用:add(2,2)未调用
你正在嘲笑方法调用在正确的地方.但是,由于您是从实例调用该方法,因此它是一个绑定方法,因此self除了所有其他参数之外,还接收实例作为第一个参数(参数).
编辑:由于Bar被Mock实例替换,Bar().add不知道它是一个方法(因此不受任何约束).换句话说,Bar是a Mock,Bar()是a Mock,Bar().add也是a 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)
Run Code Online (Sandbox Code Playgroud)
根据您的实际代码的外观,您可能希望模拟方法而不是类:
@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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12764 次 |
| 最近记录: |