相关疑难解决方法(0)

python mock - 在不妨碍实现的情况下修补方法

是否有一种干净的方法来修补对象,以便您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,但是我希望有一种更好的方法可以在所有函数,类方法,静态方法,未绑定方法等上以相同的方式工作.

python mocking

47
推荐指数
3
解决办法
1万
查看次数

如何在 Python 中模拟实例方法

我正在尝试测试一个类并模拟其方法之一,但我似乎无法用我的模拟行为替换其中一个实例方法的行为。我的代码是这样组织的:

--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 …

python unit-testing mocking python-3.x

5
推荐指数
1
解决办法
5519
查看次数

尝试模拟实例方法时的最大递归深度

我想模拟一个实例方法.首先,我想修改参数,然后我想调用原始方法.

我试过这个:

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)

python recursion mocking

0
推荐指数
1
解决办法
1208
查看次数

标签 统计

mocking ×3

python ×3

python-3.x ×1

recursion ×1

unit-testing ×1