我正在嘗試為我創建的 UpdateView 撰寫測驗。
我的觀點是這樣的:
class MutantUpdateView(UpdateView):
context_object_name = "mutant"
fields = ["mutation_level"]
model = Mutant
pk_url_kwarg = "mutant_id"
template_name_suffix = "_update_form"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["admin"] = get_object_or_404(
Person, id=self.kwargs["admin_id"]
)
context["backstory"] = get_object_or_404(
Backstory, id=self.kwargs["backstory_id"]
)
context["evidences"] = self.object.evidences.all()
return context
def get_form(self, form_class=None):
form = super().get_form(form_class)
mutant = self.object
mutation_levels = (
mutant.expectation.mutation_levels.all()
)
form.fields["mutation_level"].queryset = mutation_levels
return form
def form_valid(self, form):
form.instance.updated_by = = get_object_or_404(
Person, id=self.request.user.person_id
)
return super().form_valid(form)
def get_success_url(self, **kwargs):
return reverse_lazy(
"mutants:mutant-update",
kwargs={
"admin_id": self.kwargs["admin_id"],
"backstory_id": self.kwargs["backstory_id"],
"mutant_id": self.kwargs["mutant_id"],
},
)
我的測驗看起來像這樣(根據檔案)
def test_form_valid_posts_appropriately(self):
new_level = MutantLevelFactory(short_description="Next Mutant Level")
self.mutant.expectation.mutation_levels.add(new_level)
data = {
"created_by": self.admin_person.id,
"updated_by": self.admin_person.id,
"backstory": self.mutant.backstory.id,
"expectation_level": new_level,
"expectation": self.mutant.expectation.id,
}
kwargs = {
"admin_id": self.admin_person.id,
"backstory_id": self.mutant.backstory.id,
"mutant_id": self.mutant.id,
}
request = self.factory.get(
reverse("mutants:mutant-update", kwargs=kwargs)
)
request.user = self.admin_user # simulate admin user logged in
self.view.setup(request)
context = self.view.get_context_data()
self.assertIn('backstory', context)
self.assertFalse(context["form"].errors)
self.assertEqual(response.status_code, 302)
它給了我這個錯誤:
def get_form(self, form_class=None):
form = super().get_form(form_class)
> mutant = self.object
E AttributeError: 'MutantUpdateView' object has no attribute 'object'
該模型如下所示:
class Mutant(models.Model):
id = models.BigAutoField(primary_key=True)
backstory = models.ForeignKey(
Backstory, on_delete=models.PROTECT, related_name="%(class)ss"
)
expectation = models.ForeignKey(
Expectation, on_delete=models.PROTECT, related_name="%(class)ss"
)
mutation_level = models.ForeignKey(
MutationLevel,
on_delete=models.PROTECT,
null=True,
blank=True,
related_name="%(class)ss",
)
測驗基本 Django UpdateView 的最佳方法是什么?這是最好的方法還是我應該使用Client()并進行集成型別測驗?最終,我想對這個視圖進行單元測驗和集成測驗——如果合適的話。
我嘗試以各種方式更改代碼,例如:
response = MutantUpdateView.as_view()(request, **kwargs)
但這也沒有用。
uj5u.com熱心網友回復:
問題不在于視圖,而在于測驗視圖。您的測驗旨在“模仿”視圖的代碼流,但物件是在.get(…)方法 [classy-Django]中設定的。您可能也可以實作它,但是如果您稍后更改視圖,或者添加 mixin 等。這將導致修復所有測驗。
一種通常使用django 測驗客戶端 [Django-doc]:一種可以偽造請求并將其傳遞給視圖的工具:
from django.test import TestCase
class MyTestCase(TestCase):
def test_form_valid_posts_appropriately(self):
self.client.force_login(self.admin_user)
new_level = MutantLevelFactory(short_description='Next Mutant Level')
self.mutant.expectation.mutation_levels.add(new_level)
data = {
'created_by': self.admin_person.id,
'updated_by': self.admin_person.id,
'backstory': self.mutant.backstory.id,
'expectation_level': new_level,
'expectation': self.mutant.expectation.id,
}
kwargs = {
'admin_id': self.admin_person.id,
'backstory_id': self.mutant.backstory.id,
'mutant_id': self.mutant.id,
}
response = self.client.post(
reverse('mutants:mutant-update', kwargs=kwargs), data
)
self.assertIn('backstory', response.context)
self.assertFalse(response.context['form'].errors)
self.assertEqual(response.status_code, 302)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/527053.html
