【问题标题】:Testing Django view测试 Django 视图
【发布时间】:2021-08-26 07:00:37
【问题描述】:

我正在尝试测试以下视图

def generate_exercise_edl(request, ex_pk, unit_pk, *args, **kwargs):
    ex_instance = Exercises.objects.get(id=ex_pk)
    unit_instance = Units.objects.get(id=unit_pk)
    unit_edl = UnitEdl.objects.filter(unit=unit_instance)
    locations = Locations.objects.all()
    unit_edl = list(unit_edl)
    print(request)
    print(request.POST)
    print(request.user)

    if request.method == "POST":
        for item in unit_edl:
            ExerciseEdl.objects.update_or_create(unit=unit_instance, exercise=ex_instance, equipment=item.equipment,
                                                 quantity=item.quantity, location=Locations.objects.get(location="Okinawa"))
        print(request)
        return redirect('exercise-equipment', ex_pk=ex_pk, unit_pk=unit_pk)
    else:
        messages.error(
            request, f'Failed to add/update the {unit_instance.unit_name} edl for {ex_instance.exercise}.')
    context = {
        'ex_instance': ex_instance,
        'unit_instance': unit_instance,
        'unit_edl': unit_edl,
        'locations': locations,
    }
    return render(request, 'exercise/exercise_edl.html', context)

这是我的测试代码

def test_generate_edl(self):
    unit_edl = UnitEdl.objects.filter(unit=unit.pk)
    for edl in unit_edl:
        ExerciseEdl.objects.update_or_create(
            unit=unit,
            exercise=ex,
            equipment=edl.equipment,
            quantity=edl.quantity,
            location=loc
        )
    response = self.client.post(
        f'/exercise/{ex.pk}/edl/{unit.pk}/convert/')
    ex_edl = ExerciseEdl.objects.all().count()
    self.assertEquals(ex_edl, 2)
    self.assertEqual(response.status_code, 302)

这是视图的 URL

path('exercise/<int:ex_pk>/edl/<int:unit_pk>/convert', views.generate_exercise_edl, name='generate-edl'),

以及调用我的函数的模板部分

<form action="{% url 'generate-edl' ex_pk=ex_instance.id unit_pk=unit_instance.id %}" method="post">
    {% csrf_token %}
     <input class="btn btn-primary btn-sm mt-2" type="submit" value="Generate EDL">
</form>

我的测试返回 404,而不是 302,但网站上的功能有效,并重定向您。 f'/exercise/{ex.pk}/edl/{unit.pk}/convert/' 没有映射到任何模板,它只是函数的 url。过去,当我错误地写入帖子数据时,我的测试返回了状态码 404。

print(request.POST) 返回:

这是有道理的,因为我没有发送任何帖子数据,只是发送 csrf 令牌。

我想知道的是,我在使用 'response = self.client.post( f'/exercise/{ex.pk}/edl/{unit.pk}/convert/')'? 在我的其他测试中,我将帖子数据与 URL 一起包含在字典中,但这个函数不使用任何函数,所以我只运行了一个类似的函数。

有没有更好的方法来测试这个?我应该重构吗?

【问题讨论】:

    标签: django django-views django-tests


    【解决方案1】:

    您需要使用reverse 来构建您的网址,而不是对其进行硬编码。由于您对其进行了硬编码,因此它会收到 404,因为测试尝试发布到的 URL 不正确。

    我不知道您的 URL 文件中的 app_name,您需要将其添加到相反的位置。例如,如果它是excercise,那么它将是exercise:generate-edl

    from django.urls import reverse
    
    
    response = self.client.post(reverse(
        '<app_name>:generate-edl',
        kwargs={
            ex_pk: ex.pk,
            unit_pk: unit.pk,
        }
    ))
    

    【讨论】:

    • 我忘了包括反面!糟糕,现已添加!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    相关资源
    最近更新 更多