是否有一种干净的方法来修补对象,以便您assert_call*在测试用例中获得帮助程序,而无需实际删除操作?
例如,如何修改该@patch行以获得以下测试传递:
from unittest import TestCase
from mock import patch
class Potato(object):
def foo(self, n):
return self.bar(n)
def bar(self, n):
return n + 2
class PotatoTest(TestCase):
@patch.object(Potato, 'foo')
def test_something(self, mock):
spud = Potato()
forty_two = spud.foo(n=40)
mock.assert_called_once_with(n=40)
self.assertEqual(forty_two, 42)
Run Code Online (Sandbox Code Playgroud)
我可能会一起使用side_effect,但是我希望有一种更好的方法可以在所有函数,类方法,静态方法,未绑定方法等上以相同的方式工作.
我正在尝试测试一个类并模拟其方法之一,但我似乎无法用我的模拟行为替换其中一个实例方法的行为。我的代码是这样组织的:
--src
----module
------__init__.py
------my_class.py
--tst
----__init__.py
----test_my_class.py
my_class.py包含以下内容
class MyClass:
def __init__(self):
pass
def do_something(self):
return 'Real Output'
Run Code Online (Sandbox Code Playgroud)
我的测试文件test_my_class.py包含以下内容。
from unittest.mock import patch
from src.module.my_class import MyClass
def test_my_class():
my_class = MyClass()
assert my_class.do_something() == 'Real Output'
@patch('src.module.my_class.MyClass')
def test_mock_my_class(mock_my_class):
mock_my_class.return_value.do_something.return_value = 'Mocked Output'
my_class = MyClass()
assert my_class.do_something() == 'Mocked Output'
Run Code Online (Sandbox Code Playgroud)
第一个测试工作得很好(到目前为止没有涉及任何模拟)。然而,第二个测试给了我以下断言错误。我希望该do_something()方法被模拟并返回“模拟输出”,并且断言语句的计算结果为 true。我这里哪里出错了?
AssertionError: assert <bound method MyClass.do_something of <src.module.my_class.MyClass object at 0x1057133c8>> == 'Mocked Output'
E + where <bound method MyClass.do_something of …
我想模拟一个实例方法.首先,我想修改参数,然后我想调用原始方法.
我试过这个:
import mock
class Foo(object):
def my_method(data):
print(data)
def wrapped_method(data):
return Foo.my_method(data.replace('x', 'o'))
with mock.patch.object(Foo, 'my_method', wraps=wrapped_method):
foo = Foo()
foo.my_method('axe') # should print "aoe"
Run Code Online (Sandbox Code Playgroud)
但是我得到了这个例外:
/home/foo/bin/python /home/foo/src/wrap-instance-method.py
Traceback (most recent call last):
File "/home/foo/src/wrap-instance-method.py", line 15, in <module>
foo.my_method('axe') # should print "aoe"
File "/home/foo/local/lib/python2.7/site-packages/mock.py", line 955, in __call__
return _mock_self._mock_call(*args, **kwargs)
File "/home/foo/local/lib/python2.7/site-packages/mock.py", line 1024, in _mock_call
return self._mock_wraps(*args, **kwargs)
.....
return self._mock_wraps(*args, **kwargs)
File "/home/foo/src/wrap-instance-method.py", line 10, in wrapped_method
return Foo.my_method(data.replace('x', 'o'))
File "/home/foo/local/lib/python2.7/site-packages/mock.py", line 955, …Run Code Online (Sandbox Code Playgroud)