0

FormView をテストする適切な方法を見つけるのに苦労しています。ユーザーが認証されていないときにメッセージ (django.contrib.messages によって生成された) がレンダリングされるかどうかを確認したいと思います。RequestFactory、Client、Mock、Middleware については既に読みましたが、CBV FormView でこのテストを実装できませんでした。

問題は特にユーザーの認証に関するものではありません。他のフィールドでもロジックを使用して、他のメッセージをテストしたいと考えています。

これが私のコードです:

意見:

class MyView(FormView):

    form_class = MyForm
    template_name = 'app/welcome_template.html'
    
    def form_valid(self, form):
        form_data = form.cleaned_data
        auth = LDAPBackend() 
        user = auth.authenticate(self.request, username=form_data['login_field'], password=form_data['password_field'])
                

        if user:
           return super(MyView, self).form_valid(form)
        else:
            messages.add_message(self.request, messages.WARNING, 'some warning' + str(form_data['other_field']))
            return self.form_invalid(form)

形:

class MyForm(forms.Form):
   
    login_field = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Login', 'class': 'form-control form-control-sm'}), 
                                 label='Login:', max_length=20)
    password_field = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': 'Password', 'class': 'form-control form-control-sm'}), 
                                    label='Password:', max_length=20)
    other_field = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Select ...', 
                                                            'class': 'form-control form-control-sm',
                                                            'max': '99999999'}), 
                              label='Other:')

テンプレート:

<form autocomplete="off" onsubmit="$('#ModalCenter').modal({backdrop: 'static', keyboard: false})" action="." target="_top" method="post">
{% csrf_token %}
            <div class="row">
                <div>
                  {% if messages %}
                        {% for message in messages %}
                        <div class="alert {% if message.tags %}alert-{{ message.tags }}{% endif %}" role="alert">{{ message }}</div>
                        {% endfor %}
                    {% endif %}
                </div>
                <div class="form-group mt-2">
                    {{ form.login_field.label_tag }}
                    {{ form.login_field }}     
                </div>
                <div class="form-group mt-2">
                    {{ form.password_field.label_tag }}
                    {{ form.password_field }}
                </div>
                <div class="form-group autocomplete mt-2">
                    {{ form.other_field.label_tag }}
                    {{ form.other_field }}
                </div>
            
                <button type="submit" class="btn btn-primary mb-2 btnexecute" id="submitbutton">Run</button>
            </div>
        </form>

このテストを使用すると、メッセージ リストは常に空になります。

from django.test import TestCase, RequestFactory, Client
from django.urls import reverse
from .views import MyView
from caf.settings import V_USER, V_PWD
from django.contrib.messages import get_messages

class MyViewTestCase(TestCase):

    def setUp(self):
        self.factory = RequestFactory()
        self.client = Client()

    def test_message(self):

        input_data = {'login_field': V_USER,
                      'password_field': V_PWD,
                      'other_field': 'other...'}
        
        request = self.factory.post(reverse('welcome_template'), data=input_data, follow=True)
        response = MyView.as_view()(request)

        print(len(get_messages(response.wsgi_request)))
        print(len(response.context['messages']))

どんな助けにも感謝します。

前もって感謝します。

4

0 に答える 0