Mock 不断调用真实函数

Rub*_*ico 4 python django unit-testing mocking

我正在尝试模拟一个函数。当我尝试模拟该函数时,core.use_cases.add_owner_to_place模拟不起作用。它不断打印“哎哟”。

我尝试测试一下mocked_add_owner_to_place.called,结果返回False。

有谁知道为什么即使我模拟它它仍然使用真实的函数?

视图.py:

from core.use_cases import add_owner_to_place

class CreatePlace(LoginRequiredMixin, FormView):
template_name = 'place/create_place.html'
form_class = PlaceForm
success_url = reverse_lazy('place_list')

def form_valid(self, form):
    place = form.save()
    add_owner_to_place(place, self.request.user)
    return super(CreatePlace, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)

测试.py:

from unittest.mock import patch, Mock

@patch('core.use_cases.add_owner_to_place')
@patch('core.forms.PlaceForm.is_valid')
@patch('core.forms.PlaceForm.save')
def test_save_should_be_called(self, mocked_save, mocked_is_valid, mocked_add_owner_to_place):
    self.client.post(reverse('place_create'), data={})
    self.assertTrue(mocked_save.called)
Run Code Online (Sandbox Code Playgroud)

use_cases.py:

def add_owner_to_place(place, user):
    print('Ouch')
Run Code Online (Sandbox Code Playgroud)

Rub*_*ico 5

因此,在 github 上四处搜索并查看一些代码,我发现view即使该函数属于该use_cases模块,我也需要进行模拟。

所以我现在的代码是:

测试.py

from unittest.mock import patch, Mock

@patch('core.views.add_owner_to_place')
@patch('core.forms.PlaceForm.is_valid')
@patch('core.forms.PlaceForm.save')
def test_save_should_be_called(self, mocked_save, mocked_is_valid, mocked_add_owner_to_place):
    self.client.post(reverse('place_create'), data={})
    self.assertTrue(mocked_save.called)
Run Code Online (Sandbox Code Playgroud)

我知道这是有效的,但现在我需要寻找它为何有效。当我弄清楚时我会解释它。

  • 其原因在[文档](https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch)中有相当彻底的解释 (2认同)