django测试:如何启动可以访问测试数据库的后台进程?

时间:2021-01-31 19:17:01

I'm trying to write a test using the django testing framework, the test spawns a new background process that has access the test datebase. The test looks like this,

我正在尝试使用django测试框架编写一个测试,该测试生成一个新的后台进程,该进程可以访问测试数据基。测试是这样的,

temp_project/temp_app/tests.py

temp_project / temp_app / tests.py

import subprocess
from django.test import TestCase                                                                                                                    
from temp_app.models import TempModel

# Create your tests here.                                                                                                                             

class TempTest(TestCase):

    def setUp(self):
        TempModel.objects.create()

    def test_main(self):

        self.assertEqual(str(TempModel.objects.all()) + '\n',
                     subprocess.check_output(['python', 'manage.py', 'temp_command']))

The subprocess simply prints out the contents of the database, temp_project/temp_app/management/commands/temp_command.py

子进程只打印出数据库的内容,temp_project/temp_app/management/commands/temp_command.py

from temp_app.models import TempModel
from django.core.management.base import BaseCommand

class Command(BaseCommand):

    def handle(self, *args, **kwargs):
        print TempModel.objects.all()

The model is an empty placeholder, temp_project/temp_app/models.py

模型是一个空的占位符,temp_project/temp_app/models.py

from django.db import models

# Create your models here.                                                                                                                            
class TempModel(models.Model):
    pass

However the output from the test looks like,

但是测试的输出是这样的,

> python manage.py test
Creating test database for alias 'default'...
F
======================================================================
FAIL: test_main (temp_app.tests.TempTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/dvoong/projects/opentrv/ors/source/temp/temp_project/temp_app/tests.py", line 15, in test_main
    subprocess.check_output(['python', 'manage.py', 'temp_command']))
AssertionError: '[<TempModel: TempModel object>]\n' != '[]\n'

----------------------------------------------------------------------
Ran 1 test in 0.285s

FAILED (failures=1)
Destroying test database for alias 'default'...

So it seems the subprocess is accessing the production database instead of the test one. Any ideas? The database settings are, the default values,

因此,看起来子进程正在访问生产数据库,而不是测试数据库。什么好主意吗?数据库设置为,默认值,

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

1 个解决方案

#1


1  

The subprocess not using the test database is to be expected since you the subprocess isn't running a test command anyway. The solution would be to create a new settings file and pass it as a parameter to your subprocess using the --settings parameter. Naturally this new settings file should point to the test database.

不使用测试数据库的子进程是可以预期的,因为无论如何子进程都没有运行测试命令。解决方案是创建一个新的设置文件,并使用-settings参数将其作为参数传递给子进程。当然,这个新的设置文件应该指向测试数据库。

#1


1  

The subprocess not using the test database is to be expected since you the subprocess isn't running a test command anyway. The solution would be to create a new settings file and pass it as a parameter to your subprocess using the --settings parameter. Naturally this new settings file should point to the test database.

不使用测试数据库的子进程是可以预期的,因为无论如何子进程都没有运行测试命令。解决方案是创建一个新的设置文件,并使用-settings参数将其作为参数传递给子进程。当然,这个新的设置文件应该指向测试数据库。