Django Testing - 在加载应用程序之前将数据加载到数据库中

时间:2017-07-04 15:59:24

标签: python django django-rest-framework django-testing django-tests

我目前正在为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()之后重新加载应用程序,或者实例化我的类在其他地方,所以在加载数据后调用它?

谢谢!

2 个答案:

答案 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