Python 如何使用测试数据库响应django.test.Client

Python 如何使用测试数据库响应django.test.Client,python,mysql,django,django-1.9,Python,Mysql,Django,Django 1.9,我有一个djangosettings.py文件,其中有一个配置好的数据库,导致两个mysql数据库,我们把它们称为dbname和test\u dbname 当运行类似于python manage.py test…的命令时,对象选择 MyClass.objects.all() 将从test\u dbname中选择对象,迄今为止效果良好 另一方面,如果我使用 client = django.test.Client() response = client.post(...) 然后,创建client

我有一个django
settings.py文件,其中有一个配置好的数据库,导致两个mysql数据库,我们把它们称为
dbname
test\u dbname

当运行类似于
python manage.py test…
的命令时,对象选择

MyClass.objects.all()
将从
test\u dbname
中选择对象,迄今为止效果良好

另一方面,如果我使用

client = django.test.Client()
response = client.post(...)
然后,创建
client
对象和
post
参数的测试代码(或线程,我不确定)使用
test\u dbname
,而为
post
请求提供服务并生成响应的线程使用
dbname
(没有预先设置测试)

这是一个不便之处,因为:

  • 如果请求依赖于服务器线程的数据库,则我的测试代码无法正确地表达请求(即post数据),从而导致以下问题
  • 现在有两个数据库正在测试中,而其中只有一个数据库的内容似乎可以从我的测试代码中控制,这使得测试不可预测

  • 我可以让服务器线程使用一个我可以从测试用例线程控制的数据库吗?

    感谢knbk的提示解决了这个问题:答案是在单元测试开始之前不应该运行任何查询。在我的例子中,这意味着替换一个表单定义,如

    class MyForm(forms.Form):
        my_field = forms.ChoiceField(choices=<somequery>)
    

    测试客户端不像WSGI服务器那样使用单独的线程。它只是直接调用相关的Django函数,否则这些函数将响应WSGI请求。如果查询引用了错误的数据库,则很可能是在设置测试数据库之前执行查询。啊,谢谢,这似乎解决了问题,下面将描述这种情况。
    class MyForm(forms.Form):
        my_field = forms.ChoiceField()
        def __init__(self, *args, **kwargs):
            super(MyForm, self).__init__(self, *args, **kwargs)
            self.fields['my_field'].choices = <somequery>