Насмешка над статическим вызовом функции с помощью длинной цепочки вызовов в Python 2.7 - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь протестировать большое унаследованное приложение Django, и меня смущает насмешка над Python, так как я никогда не работал над большим приложением Python.

В частности, у меня есть метод с длинной цепочкой вызовов внутри, который генерирует массив:

def update(self): # in some class X
    # ...
    for z in foo.models.Bar.objects.filter(x=1).select('xyz'):
        raise Exception("mocked successfully")

Я бы хотел издеваться над foo.models.Bar.objects.filter(x=1).select('xyz').

Попытка 1

Я пробовал несколько подходов, почерпнутых из различных вопросов, особенно с использованием декоратора:

@mock.patch('foo.models.Bar.objects.filter.select')
def test_update(self, mock_select):
    mock_select.return_value = [None]
    X().update()

Я никогда не нажимал на внутреннюю часть поддельного вызова, однако тест должен завершиться неудачей из-за возникающего исключения.

Попытка 2

@mock.patch('foo.models.Bar')
def test_update(self, mock_Bar):
    mock_Bar.objects.filter(x=1).select('xyz').return_value = [None]
    X().update()

Попытка 3

@mock.patch('foo.models.Bar')
def test_update(self, mock_Bar):
    mock_Bar.objects.filter().select().return_value = [None]
    X().update()

Попытка 4

Затем я попробовал что-то более простое, чтобы посмотреть, смогу ли я получить NPE, который тоже не работал.

@mock.patch('foo.models.Bar')
def test_update(self, mock_Bar):
    mock_Bar.return_value = None
    X().update()

Все мои попытки проходят тест вместо срабатывания исключения, как я и ожидаю.

Уже поздно, поэтому я предполагаю, что я должен пропустить что-то простое в примерах, которые я видел !?

1 Ответ

0 голосов
/ 12 сентября 2018

Мне удалось пройти мимо насмешливых предметов.Попытка № 3 близка, вам просто нужно изменить ее на filter.return_value.select.return_value, чтобы она прошла.Вот мое предложение, хотя, как кажется, насмешливый .objects является предпочтительным способом.

@mock.patch('foo.models.Bar.objects')
def test_update(self, mock_bar_objects):
    mock_bar_objects.filter.return_value.select.return_value = [None]
    X().update()

РЕДАКТИРОВАТЬ: Результат тестового прогона:

ERROR: test_update (test_x.TestDjango)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/wholevinski/.virtualenvs/p2/lib/python2.7/site-packages/mock/mock.py", line 1305, in patched
    return func(*args, **keywargs)
  File "/home/wholevinski/so_test/django_mock/test/test_x.py", line 10, in test_update
    X().update()
  File "/home/wholevinski/so_test/django_mock/foo/x_module.py", line 6, in update
    raise Exception("mocked successfully")
Exception: mocked successfully

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (errors=1)
...