0

我正在尝试在使用 Django 处理 ModelForms 时测试消息的内容。我有以下视图(假设有一个Thing带有必填name字段的模型):

@login_required
def update(request, thing_id):
    thing = Thing.objects.get(id=thing_id)  # assume this works

    if request.method == "POST":
        form = ThingModelForm(request.POST, instance=thing)
        if form.is_valid():
            form.save()
            messages.success(request, "Success!")
            return redirect("/wherever")
        else:
            messages.error(request, "Oops!")
    else:
        form = ThingModelForm(instance=thing)

    args = ("myapp/update.html", {"form": form})
    kwargs = {"context_instance": RequestContext(request)}
    return render_to_response(*args, **kwargs)

现在,我有两个单元测试。第一个测试有效数据,而第二个测试无效数据。(请注意,客户端登录发生在 期间setUp):

def test_update_account(self):
    url = reverse('update', args=[1])  # assume that's a valid id
    resp = self.client.post(url, {"name": "foo"})
    self.assertEqual(resp.status_code, 302)

    m = resp.cookies.get('messages', '')
    self.assertTrue("Success!" in m.output())

现在来测试无效数据:

def test_update_account_failure(self):
    url = reverse('update', args=[1])  # assume that's a valid id
    resp = self.client.post(url, {"name": ""})  # name is required
    self.assertEqual(resp.status_code, 200)

    # This works:
    self.assertTrue("Oops!" in resp.content)

    # This fails:
    m = resp.cookies.get('messages', '')
    self.assertTrue("Oops!" in m.output())

为什么通过 cookie 访问消息内容在一种情况下有效,但在另一种情况下会失败?

4

1 回答 1

1

您可以检查两件事:

  1. 当您创建请求时self.client.post(url, {"name": ""}),此处返回的 Thing 实例:thing = Thing.objects.get(id=thing_id)如果不是,它将不会到达您设置错误消息的代码行:messages.error(request, "Oops!")因为 Thing.objects.get 将抛出错误

如果没有与查询匹配的结果,get() 将引发 DoesNotExist 异常。

  1. 如果第一件事确实返回了一个 Thing 实例,您可以redirect("/wherever")在设置错误消息后检查重定向返回是否messages.error(request, "Oops!")确实改变了任何内容。
于 2012-09-21T18:00:30.030 回答