1

我在“帐户”应用程序中有一个 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')])

还有另一个应用程序“电子商务”,其模型 Product(为简洁起见)具有一个 ForeignKey 到上面的 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 时不起作用:

视图.py

class ProductCreateView(CreateView):
    model = Product
   [...]

    def form_valid(self, form):
        form.instance.seller = self.request.user
        return super().form_valid(form)

测试.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."

我尝试将我在 TestCase 的 'setUp()' 函数中定义的 self.user 传递给 line self.client.user = self.user,但它继续抛出错误。

如何让我的测试通过 CustomUser 而不是它在运行脚本时使用的 AnonymousUser?

4

1 回答 1

0

你得到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')

您可以在此处阅读有关这些更改的更多信息

于 2021-07-07T02:45:01.220 回答