我目前正在为 Django 应用程序(+ REST 框架)编写一些测试,并且在将测试数据加载到数据库中时遇到一些问题。
让我用一些(非常简化的)代码来解释:
我有一个 django 视图,类似于:
view.py
from myapp.models import Item
from myapp.utils import MyClass
# need to initialize with the set of items
item_set = {item.name for item in Item.objects.all()}
my_class_object = MyClass(item_set)
class MyView(APIView):
def post(selfself, request):
result = my_class_object.process(request.data)
return Response(result)
所以基本上我需要用数据库中的一些数据初始化一个类,然后在我的视图中使用这个类来处理端点接收到的数据。
现在测试:
my_test.py
from rest_framework.test import APILiveServerTestCase
from myapp.models import Item
class MyTest(APILiveServerTestCase):
def setUp(self):
self.URL = '/some_url_linking_to_myview/'
# load some data
Item.objects.create(name="first item")
Item.objects.create(name="second item")
def test_myview_return_correct_result(self):
post_data = {"foo"}
response = self.client.post(self.URL,
data=post_data,
format='json')
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, {"my_expected_result"})
运行测试时,当前发生的情况是 view.py 在执行 setUp() 方法之前加载,因此当我用这两行实例化类时:
item_set = {item.name for item in Item.objects.all()}
my_class_object = MyClass(item_set)
数据库还是空的。
我想知道是否有一种方法可以在执行 view.py 之前将数据存入数据库,或者在 setUp() 之后强制重新加载应用程序,或者在其他地方实例化我的类,以便在之后调用它正在加载数据?
谢谢!
setUpTestData()
。
如果我要使用大量数据,我的设置方式大致如下:
测试.py
from django.test import TestCase
from .tests.test_data import base_data
class MyClassTest(TestCase):
@classmethod
def setUpTestData(cls):
base_data.base_data(cls)
base_data.py
from .models import MyClass
def base_data(cls):
cls.MyClass1 = MyClass.objects.create(
name="first_name"
)
cls.MyClass2 = MyClass.objects.create(
name="second_name"
)
当然,如果您希望将测试数据放在顶部,您可以直接在
setUpTestData()
函数中执行所有操作。
为什么不将启动代码放在函数中并从帖子内部调用。
class MyView(APIView):
def initialize(self):
item_set = {item.name for item in Item.objects.all()}
my_class_object = MyClass(item_set)
def post(self, request):
self.initialize()
result = my_class_object.process(request.data)
return Response(result)
Edit 1
或者,您可以使用fixture预先加载数据库中的MyClass对象
class MyTest(APILiveServerTestCase):
fixtures = [
// my class objects fixtures file
]
def setUp():
// rest of the code
虽然这个问题很老了,但对于现在可能想知道的人来说,管理这个问题的最佳方法是使用固定装置:https://docs.djangoproject.com/en/5.1/howto/initial-data/