模拟一直在调用真正的功能

时间:2017-10-15 00:52:11

标签: python django unit-testing mocking

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

我试过测试mocked_add_owner_to_place.called并返回False。

有人知道为什么即使我嘲笑它也会继续使用真正的功能吗?

views.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)

tests.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)

uses_cases.py:

def add_owner_to_place(place, user):
    print('Ouch')

1 个答案:

答案 0 :(得分:2)

所以,在github上搜索并查找一些代码,我发现我需要从view进行模拟,即使该函数属于use_cases模块。

所以我的代码现在是:

<强> tests.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)

我知道这有效,但现在我需要搜索它的工作原理。我弄清楚的时候会解释它。