Как передать аргументы new_callable из mock.patch? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть код и тестовые файлы:

code.py

class Code:

    def do_something_inside(self, a, b, c):
        return a-b-c

    def do_something(self, b, c):
        self.do_something_inside(30, b, c)

test.py

import unittest
import unittest.mock as mock
from code import Code

class TestStringMethods(unittest.TestCase):
    def setUp(self):
        self.code = Code()

    def do_something_inside_stub(self, a, b, c):
        return a+b+c

    @mock.patch('code.Code.do_something_inside', new_callable=do_something_inside_stub)
    def test_add(self):
        self.assertEquals(self.code.do_something(10, 5), 45)

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

Я хочу издеваться над do_something_insideметод с использованием do_something_inside_stub, но выполнение не удалось:

E
======================================================================
ERROR: test_add (__main__.TestStringMethods)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.6/unittest/mock.py", line 1171, in patched
    arg = patching.__enter__()
  File "/usr/lib/python3.6/unittest/mock.py", line 1293, in __enter__
    new = Klass(**_kwargs)
TypeError: do_something_inside_stub() missing 4 required positional arguments: 'self', 'a', 'b', and 'c'

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)

Я не знаю, как передать аргументы new_callable из mock.patch.

1 Ответ

0 голосов
/ 07 июня 2018

new_callable требует класса, унаследованного от Mock, объект которого будет создан для этого макета.Функциональность, которую вы ищете, это side_effect.Ссылка: https://docs.python.org/3/library/unittest.mock.html#the-mock-class

Используйте следующий код:

@mock.patch('code.Code.do_something_inside', side_effect=do_something_inside_stub)
def test_add(self, do_something_inside_mock):
    do_something_inside_mock.assert_called
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...