【问题标题】:Django save a model instance when testing but can't find it in real databaseDjango在测试时保存模型实例但在真实数据库中找不到
【发布时间】:2018-09-22 09:31:48
【问题描述】:

我是 Django 新手,在进行测试时,我在 setup() 函数中为下面的测试创建了一个新的测试模型记录,它成功了,我可以在下面的代码中访问该记录,但是当我去查看真实数据库,新记录不存在。

设置代码如下:

class UserTest(TestCase):
    def setUp(self):
        test_user = User.object.create(name='test')

当我在 setUp() 函数中设置断点,并在创建 'test_user' 之后,我可以使用 'User.object.get()' 来获取创建的用户,但是当我进入真实数据库时检查用户表,我找不到这条记录。顺便说一句,我使用的是 postgreSQL。

测试运行器正在使用这个:

class NoDBTestRunner(DiscoverRunner):
    def setup_databases(self, **kwargs):
        pass
    def teardown_databases(self, old_config, **kwargs):
        pass

我想知道创建的数据记录存储在哪里? 任何建议都会很有帮助

【问题讨论】:

  • Django 使用单独的数据库进行测试,在您运行测试时创建和销毁。
  • 感谢丹尼尔的回答。我可以在下面的测试函数中访问存储在真实 pg 数据库中的其他真实数据,如果 django 为“test_user”记录创建一个单独的临时数据库,这意味着 django 测试模块同时使用真实 pg 数据库和单独的临时数据库来服务我测试代码?如果django在real pg db中找不到记录,就会去自己创建的单独的db,是不是?

标签: django postgresql unit-testing


【解决方案1】:

Django 单元测试创​​建一个单独的数据库进行测试。不使用主数据库以避免测试可能导致的错误。

【讨论】:

  • 谢谢,但即使我使用 NoDBTestRunner 运行器,django 也会创建单独的数据库?
  • @JaydenFoo 你从哪里得到NoDBTestRunner?它似乎不是 Django 核心的一部分。顾名思义,它不会创建数据库,但也可能不会使用您的“真实”数据库。
  • @Kal 我自己定义了 NoDBTestRunner,覆盖了 DiscoverRunner。很奇怪我用wireshark抓包发现django居然给远程数据库发送了“INSERT”命令,远程db回复了插入成功的消息,但是当我查看远程db时,我可以'找不到新插入的记录。
  • @JaydenFoo 测试完成运行后您检查了远程数据库吗?如果是这样,可能是因为测试用例自动包装在事务中,这些事务在测试结束时自动回滚。并且根据事务隔离级别,即使在测试运行的中间,您也可能无法找到行,例如,如果您打开与数据库的新连接会话。
  • @Kal 是的,根据您的建议,我发现所有操作都包含在事务中,并且在测试后它将回滚到初始检查点。谢谢!!
猜你喜欢
  • 1970-01-01
  • 2013-09-07
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多