我如何 运行 Django 测试使用 CustomUser(AbstractUser) class 而不是默认的 AbstractUser 在测试期间正确分配外键?
How do I run Django test using a CustomUser(AbstractUser) class instead of default AbstractUser for correct ForeignKey assignment during test?
我在 'accounts' 应用程序中有一个 CustomUser 模型,它覆盖了 Django 的默认设置 auth.User:
class CustomUser(AbstractUser):
age = PositiveIntegerField(null=True, blank=True)
user_type = CharField(max_length=8, null=False, choices=[('customer', 'Customer'), ('owner', 'Owner')])
另一个应用程序 'ecommerce' 带有模型产品(为简洁起见缩写),上面的 CustomUser 字段有外键:
class Product(Model):
name = CharField(max_length=255, null=False, blank=False)
[...]
seller = ForeignKey(CustomUser, on_delete=CASCADE, related_name='products')
当我创建新产品时,我在模型上使用 form_valid() 函数来根据 Django 通过 CreateView 使用的请求设置用户。这在我在浏览器中工作时有效,但在我尝试通过测试脚本验证我的 ProductCreateView 时无效:
views.py
class ProductCreateView(CreateView):
model = Product
[...]
def form_valid(self, form):
form.instance.seller = self.request.user
return super().form_valid(form)
test.py
def test_product_create_view(self):
response = self.client.post(
reverse('ecommerce_post_product'), {
'name': 'newProduct', 'price': 2.99, 'category': 'newCategory',
'quantity': 100, 'shipping': 'standard',
}) # error happens here
self.assertEqual(response.status_code, 302) # test does not reach this line
当我 运行 我的测试时,这个测试总是抛出一个错误,指出 ValueError: Cannot assign "<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x7fbce54f0040>>": "Product.seller" must be a "CustomUser" instance."
我尝试通过 self.client.user = self.user
行传递我在 TestCase 的 'setUp()' 函数中定义的 self.user,但它继续抛出错误。
如何让我的测试通过 CustomUser 而不是它在 运行 运行脚本时使用的 AnonymousUser?
您收到 AnonymousUser
是因为您访问该视图时没有用户登录。在您的 setUp()
中创建用户,确保您正确散列密码。然后使用凭据调用 client.login
:
def setUp(self):
self.user = CustomUser.objects.create(username='testUser', email='test@email.com', password='')
self.user.set_password('secret')
self.user.save()
...
self.client = Client()
self.client.login(username='testUser', password='secret')
您可以阅读更多关于这些变化的内容here
我在 'accounts' 应用程序中有一个 CustomUser 模型,它覆盖了 Django 的默认设置 auth.User:
class CustomUser(AbstractUser):
age = PositiveIntegerField(null=True, blank=True)
user_type = CharField(max_length=8, null=False, choices=[('customer', 'Customer'), ('owner', 'Owner')])
另一个应用程序 'ecommerce' 带有模型产品(为简洁起见缩写),上面的 CustomUser 字段有外键:
class Product(Model):
name = CharField(max_length=255, null=False, blank=False)
[...]
seller = ForeignKey(CustomUser, on_delete=CASCADE, related_name='products')
当我创建新产品时,我在模型上使用 form_valid() 函数来根据 Django 通过 CreateView 使用的请求设置用户。这在我在浏览器中工作时有效,但在我尝试通过测试脚本验证我的 ProductCreateView 时无效:
views.py
class ProductCreateView(CreateView):
model = Product
[...]
def form_valid(self, form):
form.instance.seller = self.request.user
return super().form_valid(form)
test.py
def test_product_create_view(self):
response = self.client.post(
reverse('ecommerce_post_product'), {
'name': 'newProduct', 'price': 2.99, 'category': 'newCategory',
'quantity': 100, 'shipping': 'standard',
}) # error happens here
self.assertEqual(response.status_code, 302) # test does not reach this line
当我 运行 我的测试时,这个测试总是抛出一个错误,指出 ValueError: Cannot assign "<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x7fbce54f0040>>": "Product.seller" must be a "CustomUser" instance."
我尝试通过 self.client.user = self.user
行传递我在 TestCase 的 'setUp()' 函数中定义的 self.user,但它继续抛出错误。
如何让我的测试通过 CustomUser 而不是它在 运行 运行脚本时使用的 AnonymousUser?
您收到 AnonymousUser
是因为您访问该视图时没有用户登录。在您的 setUp()
中创建用户,确保您正确散列密码。然后使用凭据调用 client.login
:
def setUp(self):
self.user = CustomUser.objects.create(username='testUser', email='test@email.com', password='')
self.user.set_password('secret')
self.user.save()
...
self.client = Client()
self.client.login(username='testUser', password='secret')
您可以阅读更多关于这些变化的内容here