我目前正在为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.p 在 setUp()方法被激活之前加载,所以当我用这两个实例化类时专栏:
item_set = {item.name for item in Item.objects.all()}
my_class_object = MyClass(item_set)
数据库仍然是空的。
我想知道是否有办法在 view.py 执行之前将数据导入数据库,或者可能以某种方式强制在setUp()之后重新加载应用程序,或者实例化我的类在其他地方,所以在加载数据后调用它?
谢谢!
答案 0 :(得分:1)
我认为您正在寻找setUpTestData()
。
如果我要使用大量数据,这里大致是如何设置的:
<强> tests.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()
函数中执行所有操作。
答案 1 :(得分:0)
为什么不将启动代码放在函数中并从帖子内部调用。
(up to date)
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)
(可选)您可以使用fixture预先在数据库中加载MyClass对象
Edit 1