2

我的 Django 应用程序依赖于带有一些触发器设置的数据库。我使用这部分文档在测试数据库中为 pytest 运行器设置触发器。

@pytest.fixture(scope='session')
def django_db_setup(django_db_setup, django_db_blocker):
    with django_db_blocker.unblock():
        cur = connection.cursor()
        cur.execute([...])  # Set it up

我运行我的测试,--nomigrations它按预期工作。如果没有--nomigrations(首先测试运行迁移),触发器将不起作用。

所以试图调试这个,我已经确认

  1. 夹具正在运行,因此应该设置触发器
  2. 在我的测试开始时在调试器中暂停执行,我可以确认触发器已创建并存在于测试数据库中(通过运行psql test_<mydb>并查看pg_trigger表)
  3. 在我的夹具中暂停执行,我可以确认迁移是在夹具之前运行的。所以迁移可能会为我设置触发器,他们可能会做错,但夹具会丢弃所有触发器并重新创建它们
  4. 移除夹具并使用迁移运行不会提供新结果。所以没有理由认为夹具是问题所在。这似乎只是由于正在运行的迁移

让我再次强调一下,在没有迁移的情况下运行测试通过并在针对我的开发数据库运行开发服务器时测试功能我还可以确认它可以工作

所以,我的问题是:有什么理由让迁移运行应该做不同的事情吗?或者我的迁移是否有可能做了一些晦涩的事情导致事情失败,即这是我自己的错?

4

1 回答 1

0

放置触发器django_db_setup对我有用

@pytest.fixture(scope='session')
def django_db_setup(django_db_setup, django_db_blocker):
    with django_db_blocker.unblock():
        cur = connection.cursor()
        cur.execute('''CREATE TRIGGER search_vector_update BEFORE INSERT OR UPDATE
            ON xml_templates_template FOR EACH ROW EXECUTE PROCEDURE
            tsvector_update_trigger(search_vector, 'pg_catalog.english', name, description, info);
        ''')

pytest (4.4.1) 运行--nomigrations

于 2019-05-21T08:31:26.613 回答