Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 模型实例装置未在数据库上持久化_Django_Pytest_Pytest Django - Fatal编程技术网

Django 模型实例装置未在数据库上持久化

Django 模型实例装置未在数据库上持久化,django,pytest,pytest-django,Django,Pytest,Pytest Django,我有一个包含两个方法的测试类,希望在这两个方法之间共享一个保存的模型实例 我的固定装置: @pytest.fixture(scope='class') def model_factory(): class ModelFactory(object): def get(self): x = Model(email='test@example.org', name='test') x.s

我有一个包含两个方法的测试类,希望在这两个方法之间共享一个保存的模型实例

我的固定装置:

@pytest.fixture(scope='class')
def model_factory():
    class ModelFactory(object):
        def get(self):
            x = Model(email='test@example.org',
                      name='test')
            x.save()
            return x
    return ModelFactory()

@pytest.fixture(scope='class')
def model(model_factory):
    m = model_factory.get()
    return m
我的期望是仅接收(两种)我的测试方法上的
模型
夹具,并将其保留在数据库中:

@pytest.mark.django_db
class TestModel(object):

    def test1(self, model):
        assert model.pk is not None
        Model.objects.get(pk=model.pk)  # Works, instance is in the db

    def test2(self, model):
        assert model.pk is not None     # model.pk is the same as in test1
        Model.objects.get(pk=model.pk)  # Fails:
        # *** DoesNotExist: Model matching query does not exist
我已经使用
--pdb
验证了在
test1
结束时,运行
Model.objects.all()
返回我创建的单个实例。同时,psql未显示任何记录:

test_db=# select * from model_table;
 id | ··· fields
(0 rows)
在pdb中运行
test2
末尾的
Model.objects.all()
将返回一个空列表,考虑到表是空的,这可能是正确的

  • 为什么我的模型没有被持久化,而查询仍然返回一个实例
  • 如果我的
    model
    fixture被标记为
    scope='class'
    并保存了,为什么在第二个测试中查询不返回实例?(这是我最初的问题,直到我发现保存模型对数据库没有任何作用)
  • 使用
    django 1.6.1
    pytest django 2.9.1
    pytest 2.8.5


    谢谢

    测试必须相互独立。为了确保这一点,Django与大多数框架一样,在每次测试后都会清除数据库。请参阅。

    通过查看postgres日志,我发现默认情况下,
    pytest django
    会在每次测试后执行
    回滚以保持整洁(这是有意义的,因为测试不应该依赖于可能由早期测试修改的状态)

    通过使用
    django_db(transaction=True)
    装饰测试类,我确实可以看到psql在每个测试结束时提交的数据,这回答了我的第一个问题


    与前面一样,测试运行程序确保测试之间不保留任何状态,这是对我第二点的回答。

    在本例中,范围参数有点误导,但是如果您这样编写代码:

    @pytest.fixture(scope='class')
        def model_factory(db, request):
            # body
    
    然后您将得到一个错误,基本上是说数据库fixture必须使用“function”范围实现


    我想补充一点,这项功能目前正在开发中,将来可能会成为一项致命的功能;)

    谢谢你,丹尼尔,我怀疑是这样的@rnevius我一直在使用
    --reuse db
    选项进行pytest,以避免重新创建数据库,但是测试运行程序仍然在各个测试运行之间刷新数据,这让我感到困惑,我想
    --keepdb
    也会有同样的效果。