22

第一次使用补丁。我试图修补我的一个类进行测试。如果没有尝试运行的补丁程序可以通过测试函数定义,但是有了补丁程序,测试函数定义显然需要另一个参数,我得到一个

TypeError: testAddChannelWithNamePutsChannel() takes exactly 1 argument (2 given)

错误。测试代码如下:

import unittest
import mock
from notification.models import Channel, addChannelWithName, deleteChannelWithName

class TestChannel(unittest.TestCase):
    @mock.patch('notification.models.Channel')
    def testAddChannelWithNamePutsChannel(self):
        addChannelWithName('channel1')
        Channel.put.assert_called_with()

为什么补丁需要一个额外的参数,这个参数应该是什么?非常感谢!

4

2 回答 2

57

Patch 将修补对象的实例传递给您的测试方法(如果您在类级别进行修补,则传递给每个测试方法)。这很方便,因为它可以让你设置返回值和副作用,或者检查调用

from unittest.mock import patch

@patch('some_module.sys.stdout')
def test_something_with_a_patch(self, mock_sys_stdout):
    mock_sys_stdout.return_value = 'My return value from stdout'

    my_function_under_test()

    self.assertTrue(mock_sys_stdout.called)
    self.assertEqual(output, mock_sys_stdout.return_value)

如果您只是想从字面上修补某些东西以忽略它,那么您可以使用以下调用调用 patch

from unittest.mock import patch, Mock

@patch('some_module.sys.stdout', Mock())
def test_something_with_a_patch(self):

这用一个对象替换sys.stdout,并且不将它传递给方法。some_moduleMock

于 2013-04-17T07:03:21.457 回答
7

patch将修补后的对象传递给测试函数。它记录在这里

patch 作为函数装饰器,为您创建模拟并将其传递给装饰函数:

>>>
>>> @patch('__main__.SomeClass')
... def function(normal_argument, mock_class):
...     print(mock_class is SomeClass)
...
>>> function(None)
True
于 2013-04-17T05:14:25.280 回答