【问题标题】:Mocking forms in view unit tests在视图单元测试中模拟表单
【发布时间】:2017-04-23 12:05:08
【问题描述】:

在单元测试视图时,我似乎无法模拟表单的行为。

我的表单是一个简单的 ModelForm,位于profiles.forms。该视图(再次)是一个简单的视图,它检查表单是否有效,然后重定向。

views.py

from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
from profiles.forms import ProfileForm

def home(request):
    form = ProfileForm()

    if request.method == 'POST':
        form = ProfileForm(request.POST)

        if form.is_valid():
            profile = form.save()
            return HttpResponseRedirect(reverse("thanks"))

我的测试如下所示:

class TestViewHomePost(TestCase):
    def setUp(self):
        self.factory = RequestFactory()

    def test_form(self):
        with mock.patch('profiles.views.ProfileForm') as mock_profile_form:
            mock_profile_form.is_valid.return_value = True
            request = self.factory.post(reverse("home"), data={})
            response = home(request)
            logger.debug(mock_profile_form.is_valid.call_count)    # "0"

is_valid 没有在 mock 上被调用,这意味着 ProfileForm 没有被修补。

我在哪里做错了?

【问题讨论】:

    标签: django django-forms mocking django-unittest


    【解决方案1】:

    我能够修复模拟 is_valid 如下:

    def test_form(self):
            with mock.patch('profiles.views.ProfileForm.is_valid') as mock_profile_form:
                mock_profile_form.return_value = True
                request = self.factory.post(reverse("home"), data={})
                response = home(request)
    

    注意:您可以使用mock_profile_form.assert_called_once() 检查是否已调用模拟。

    【讨论】:

      猜你喜欢
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      • 2018-11-27
      • 1970-01-01
      • 2015-05-04
      • 2016-11-14
      • 1970-01-01
      相关资源
      最近更新 更多