相关疑难解决方法(0)

模拟函数以引发异常以测试except块

我有一个函数(foo)调用另一个函数(bar).如果调用bar()引发一个HttpError,我想特别处理它,如果状态代码是404,否则重新加注.

我试图围绕这个foo函数编写一些单元测试,嘲笑调用bar().不幸的是,我无法通过模拟调用bar()来引发由我的except块捕获的异常.

这是我的代码,说明了我的问题:

import unittest
import mock
from apiclient.errors import HttpError


class FooTests(unittest.TestCase):
    @mock.patch('my_tests.bar')
    def test_foo_shouldReturnResultOfBar_whenBarSucceeds(self, barMock):
        barMock.return_value = True
        result = foo()
        self.assertTrue(result)  # passes

    @mock.patch('my_tests.bar')
    def test_foo_shouldReturnNone_whenBarRaiseHttpError404(self, barMock):
        barMock.side_effect = HttpError(mock.Mock(return_value={'status': 404}), 'not found')
        result = foo()
        self.assertIsNone(result)  # fails, test raises HttpError

    @mock.patch('my_tests.bar')
    def test_foo_shouldRaiseHttpError_whenBarRaiseHttpErrorNot404(self, barMock):
        barMock.side_effect = HttpError(mock.Mock(return_value={'status': 500}), 'error')
        with self.assertRaises(HttpError):  # passes
            foo()

def foo():
    try:
        result = …
Run Code Online (Sandbox Code Playgroud)

python unit-testing mocking python-2.7 python-mock

97
推荐指数
1
解决办法
8万
查看次数

如何在 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
查看次数