Не можете войти в систему пользователя для тестирования с селеном в Django? - PullRequest
1 голос
/ 03 июля 2019

У меня есть следующий тест:

class FirefoxTestCases(StaticLiveServerTestCase):
    def setUp(self):
        user = User.objects.create(
            first_name="user",
            last_name="one",
            username="userone",
            is_active=True,
        )
        user.set_password("test")
        user.save()
        self.client = webdriver.Firefox()

    def tearDown(self):
        self.client.quit()

    def test_log_in_displays_firefox(self):
        # Opening the link we want to test
        self.client.get(self.live_server_url)
        assert "log in" in self.client.page_source
        self.client.find_element_by_id("id_username").send_keys("userone")
        self.client.find_element_by_id("id_password").send_keys("test")
        self.client.find_element_by_id("log_in").click()
        time.sleep(2)
        # Check the returned result
        assert "appone" in self.client.page_source

Приложение сразу переходит на страницу входа и говорит log_in просмотр

def log_in(request):
    if request.user.is_authenticated:
        return redirect("launcher")
    if request.method == "POST":
        form = LoginForm(request.POST)
        if form.is_valid():
            user = authenticate(
                request,
                username=request.POST.get("username"),
                password=request.POST.get("password"),
            )
            if user is not None:
                login(request, user)
                # 500 error occurs here
                return redirect("launcher")
        return render(request, "launcher/login.html", {"form": form})
    else:
        form = LoginForm()
        return render(request, "launcher/login.html", {"form": form})

Форма отправляется без проблем, но в журналах выдается ошибка 500. Он снова перенаправляет на страницу входа (ожидается).

У меня есть еще один тест, в котором программно выполняется логин того же пользователя:

class TestViews(TestCase):
    def setUp(self):
        user = User.objects.create(
            first_name="user",
            last_name="two",
            username="usertwo",
            is_active=True,
        )
        user.set_password("test")
        user.save()            

def test_logged_in_one_app_returns_200_and_launcher(self):
    """
    A user with one app sees the launcher.html page
    """
    user = User.objects.get(username="usertwo")
    user.set_password("test")
    user.save()
    test_client = Client()
    test_client.login(username="usertwo", password="test")
    response = test_client.get("/", follow=True)
    self.assertEqual(response.status_code, 200)
    self.assertTemplateUsed(response, "launcher/launcher.html")

Этот тест проходит и работает как задумано.

Я не могу понять, почему я получаю 500 в тесте с селеном, учитывая, что пользователь существует, и я установил пароль ... Я не уверен, что происходит не так.

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

1 Ответ

0 голосов
/ 03 июля 2019

Видимо, с перенаправлением здесь:

        if user is not None:
            login(request, user)
            # 500 error occurs here
            return redirect("launcher")

Является ли проблема, которая в конечном итоге вызывает проблемы (хотя я не уверен, почему).

Я заменил этот раздел на это:

        if user is not None:
            login(request, user)
            if not request.user.groups.all():
                return render(request, "launcher/no_apps.html")
            return render(
                request,
                "launcher/launcher.html",
                {
                    "apps": App.objects.filter(
                        groups__in=request.user.groups.all()
                    ).distinct()
                },
            )

Что сработало.

Я не уверен, почему перенаправление не сработало - но его рендеринг здесь работает как в тестовой среде, так и вживую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...