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)

これで、2 つの単体テストができました。1 つ目は有効なデータをテストし、2 つ目は無効なデータをテストします。(クライアントのログインは の実行中に発生することに注意してください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

あなたが確認できる2つのこと:

  1. リクエストを作成するself.client.post(url, {"name": ""})と、ここに Thing インスタンスが返されます:thing = Thing.objects.get(id=thing_id)そうでない場合、エラー メッセージを設定したコード行に到達しません: messages.error(request, "Oops!")Thing.objects.get はエラーをスローします。

クエリに一致する結果がない場合、get() は DoesNotExist 例外を発生させます。

  1. redirect("/wherever")最初に Thing インスタンスが返された場合は、エラー メッセージを設定した後にリダイレクトが返されmessages.error(request, "Oops!")て何かが変わるかどうかを確認できます。
于 2012-09-21T18:00:30.030 に答える