Сбой теста Django с request.user в get_inital в универсальном CreateView - PullRequest
0 голосов
/ 27 января 2012

У меня есть общее представление, подобное этому:

class SaveView(CreateView):

    def get_initial(self):
        # Get the initial dictionary from the superclass method
        initial = super(SaveView, self).get_initial()
        # Copy the dictionary so we don't accidentally change a mutable dict
        initial = initial.copy()
        initial['user'] = self.request.user
        return initial

Это представление имеет декоратор login_required, поэтому self.request.user всегда действует.

Когда я захожу на страницус браузером все работает нормально, но мои тесты не проходят.У меня есть следующие настройки теста:

from django.test import TestCase, client

class MyTest(TestCase):
    def setUp(self):
        self.client = client.Client()
    def test1(self):
        self.assertTrue(self.client.login(username='user1',password='password1'))
        data = {'name':'test 1'}
        response = self.client.post('/app/save/', data)
        self.assertEqual(response.status_code, 302)

'/ app / save /' - это URL, который вызывает это представление (он отлично работает в браузере. Моя модель имеет 2 обязательных поля: «имя» и «пользователь»)., так что это должно вызвать перенаправление на страницу созданного объекта, так как я передал имя через данные, и пользователь должен быть получен методом get_initial.

Действительно, это то, что происходит в «реальной жизни», т.е.browser.

Единственный способ, которым я мог успешно пройти этот тест, минуя «пользователя» в словаре данных.

Это ошибка в модуле django.test или это ожидаемое поведение ипочему?

Заранее спасибо

1 Ответ

1 голос
/ 27 января 2012

Это ожидаемое поведение. Из документов Django по исходным данным:

Начальный аргумент позволяет указать начальное значение, которое будет использоваться при рендеринге этого поля в несвязанной форме .

Когда вы публикуете данные в своем тесте, вы используете связанную форму, поэтому исходные данные не используются. Форма недействительна, поскольку отсутствует обязательное поле user, поэтому возвращается ответ 200, отображающий ошибки формы. Это то же самое, что произойдет, если вы очистите поле пользователя в своем браузере и отправите форму.

Вам необходимо включить пользователя в свои post данные, после чего тест пройдет.

...