Я пытаюсь протестировать большое унаследованное приложение 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()
Все мои попытки проходят тест вместо срабатывания исключения, как я и ожидаю.
Уже поздно, поэтому я предполагаю, что я должен пропустить что-то простое в примерах, которые я видел !?