模拟装饰修补程序:缺少1个必需的位置参数:“自我”

时间:2019-04-17 11:38:47

标签: python python-3.x mocking python-mock

我正在尝试运行测试方法期间修补模块select payment_account, payment_agreement, payment_pay, payment_charge from payment join charge on payment_id = charge_payment_id where charge_summ != payment_charge group by payment_id; 中的变量:

settings

我收到此错误:

from unittest import mock

class Test(...):

    @mock.patch('settings.TARGET_SCORES_PER_SECTION', True)
    def test_register_user(self):

我尝试了不同的方法,找不到解决方案。

我在做什么错了?

此版本正常工作:

ERROR: tests.test_user.transplant_class.<locals>.C (test_register_user)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 1179, in patched
    return func(*args, **keywargs)
TypeError: test_register_user() missing 1 required positional argument: 'self'

我希望将decorator用作相同的方式。

1 个答案:

答案 0 :(得分:0)

如果我了解您要尝试做的事情,这将使您了解如何做。

我已使settings.py持有FalseTARGET_SCORES_PER_SECTION的分配。在补丁中不得不提及__main__只是一个小麻烦,它不会接受不合格的名称。

import unittest
from unittest import TestCase
from unittest.mock import patch
import settings


def register_user():
    return settings.TARGET_SCORES_PER_SECTION


class Test(TestCase):

    @patch('__main__.settings')
    def test_register_user(self, mock_settings):
        # setup your mock
        mock_settings.TARGET_SCORES_PER_SECTION = True
        # test your function
        self.assertTrue(register_user())

if __name__ == '__main__':
    unittest.main()

编辑:

我认为为了更好地理解OP问题,如果您愿意,也可以将上面的代码更改为此:

import unittest
from unittest import TestCase
from unittest.mock import patch
import settings


def register_user():
    return settings.TARGET_SCORES_PER_SECTION


class Test(TestCase):

    @patch('settings.TARGET_SCORES_PER_SECTION', True)
    def test_register_user(self):
        self.assertTrue(register_user())

    if __name__ == '__main__':
        unittest.main()

其中Truenew参数。该对象用于修补您在修补字符串中提到的位置。这可能会更优雅,但是需要您有一个用于模拟的配置对象。