декоратор mock.patch: отсутствует 1 обязательный позиционный аргумент: 'self' - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь исправить переменную в модуле 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'

Я пробовал разные подходы,не смог найти решение.

Что я делаю не так?

Эта версия прекрасно работает:

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

    def _test_register_user(self):

И я надеялся, что использование в качестве декоратора будет работатьтаким же образом.

1 Ответ

0 голосов
/ 19 апреля 2019

Если я пойму, что вы пытаетесь сделать, это даст вам представление о том, как это сделать.

Я заставил settings.py оставить только присвоение False - TARGET_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()

Редактировать:

AsЯ думаю, чтобы лучше понять вопрос 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()

Где True - параметр new.Этот объект используется для исправления места, которое вы упоминаете в строке исправления.Это может быть более элегантно, но требует наличия настроенного объекта для насмешек.

...