4

テストしたいビューがあります

def change_item(request):
    name_change = request.POST.get('name_change')
    cost_change = request.POST.get('cost_change')
    category_change = request.POST.get('category_change')
    product_id = request.POST.get('product_id')
    category_name = Category.objects.get(name = category_change)
    product = Product.objects.get(id__exact = product_id)
    product.name = name_change
    product.category = category_name
    product.price = cost_change
    product.save()
    return HttpResponse()

そして、それのテストを書きましたが、動作しません(リクエストをテストしたい)

from django.test import RequestFactory
from django.test import TestCase
from views import change_item
from models import Product
from django.utils import unittest


class TestChange_item(TestCase):
    def setUp(self):
        self.factory = RequestFactory()

    def change_item_test(self):
        # Create an instance of a GET request.
        request = self.factory.get('main/views')
        # Test my_view() as if it were deployed at /customer/details
        response = change_item(request)
        self.assertEqual(response.status_code, 200)

実行すると、コンソールにこれが表示されます

ERROR: change_item_test (src.main.tests.TestChange_item)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/volodia/work/shopping-helper/src/main/tests.py", line 19, in change_item_test
response = change_item(request)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/decorators.py", line 24, in _wrapped_view
if test_func(request.user):
AttributeError: 'WSGIRequest' object has no attribute 'user'

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (errors=1)

私はそれで何ができますか?または、リクエストをテストする別の方法がありますか?

4

1 に答える 1

6

ドキュメントを見ると、リクエストにユーザーを手動で追加する必要があることがわかります。これは自動的には行われません。

def change_item_test(self):
    request = self.factory.get('main/views')
    request.user = User.objects.create_user(username="bobalong")

このようにユーザーを追加すると、ログイン リクエストの作成がシミュレートされます。これが望ましくない場合は、AnonymousUser代わりに を作成する必要があります。一般に、取得したエラーは、知る必要があるすべてを提供するはずです。リクエストにuser. 実際のユーザーを追加するか、モック ユーザー オブジェクトをリクエストに追加することが答えです。

また、POST リクエストでのみ機能するビューをテストしているようです。request.POST に正しい辞書キーがないため、失敗します。次のようにして POST リクエストを作成できます

factory.post('main/views', {'name_change': 'some name'})`
于 2013-10-19T10:54:59.000 に答える