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

问题描述 投票:0回答:3

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

谢谢!

python django django-rest-framework django-testing django-tests
3个回答
1
投票

我认为您正在寻找

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()
函数中执行所有操作。


0
投票

为什么不将启动代码放在函数中并从帖子内部调用。

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

0
投票

虽然这个问题很老了,但对于现在可能想知道的人来说,管理这个问题的最佳方法是使用固定装置:https://docs.djangoproject.com/en/5.1/howto/initial-data/

© www.soinside.com 2019 - 2024. All rights reserved.