避免使用mock.patch将第二个参数传递给每个单元测试

时间:2014-03-20 10:58:32

标签: python unit-testing mocking

我正在为我的所有单元测试嘲笑我的RpcClient课程:

import unittest2
from mock import patch

@patch('listeners.RpcClient')
class SomeTestCase(unittest2.TestCase):

    test_something(self, mock_api):
        ...

    test_something_else(self, mock_api):
        ...

对于我的大多数测试,我不想使用模拟对象做任何断言,我想做的就是修补类,以便RpcClient不会尝试连接和触发对我的每个测试的请求(我把它连接到我的一个模型上的保存后事件)。

我可以避免将mock_api传入我的每一项测试吗?

3 个答案:

答案 0 :(得分:2)

我最后使用setUp

patcher.start()进行模拟
def setUp(self):
    self.rpc_patcher = patch('listeners.RpcClient')
    self.MockClass = rpc_patcher.start()

def tearDown(self):
    self.rpc_patcher.stop()

因此,我不必修饰任何测试用例,也不必在测试中添加任何额外的参数。

更多信息:

http://docs.python.org/dev/library/unittest.mock#patch-methods-start-and-stop

答案 1 :(得分:0)

你能设置一个默认参数mock_api吗?

def test_something(self, mock_api=None):
    ...

def test_something_else(self, mock_api=None):

答案 2 :(得分:0)

您可以在调用SUT时使用mock.patch作为上下文管理器。类似的东西:

import unittest2
from mock import patch


class SomeTestCase(unittest2.TestCase):

    def call_sut(self, *args, **kwargs):
        with mock.patch('listeners.RpcClient'):
            # call SUT

    def test_something(self):
        self.call_sut()
        # make assertions

    def test_something_else(self):
        self.call_sut()
        # make assertions