【问题标题】:Created in test setup objects can not be accessed through database在测试设置中创建的对象不能通过数据库访问
【发布时间】:2018-05-02 23:50:21
【问题描述】:

我有一个

 class TestReportModel(TestCase):

   @classmethod
    def setUpClass(cls):
        cls.report_id = 99
        cls.factory = RequestFactory()
        cls.user = User.objects.create(username="user1", password="password")
        cls.report = Report.objects.create()

初始化我需要的对象

 def test_report_employee_with_access(self):
        request = self.factory.get('/reports/{}'.format(self.report_id))
        report = self.report
        report.user = request.user
        request.user = self.user
        response = report(request, self.report_id)
        self.assertEqual(response.status_code, 403)

在查看报告中

@login_required()
def report(request, report_id):
    a = Report.objects.get(id = report_id)

我可以使用 User.object.get(id = user_id) 获取我的用户。根据我的模型,用户对报告一无所知。这就是为什么我不能得到像 user.report 这样的报告。我只能创建一个像 Report.object.get(id=report_id) 这样的数据库查询,但我得到一个空查询集。我该如何解决?

【问题讨论】:

  • 只是为了排除我的答案,您是否真的在您的setUpClass 方法中调用了super 方法?
  • 不,你能解释一下吗?
  • 您是否阅读了我回答中的警告,或者点击了文档的链接?在文档中,有一个如何正确覆盖setUpClass 的示例。
  • 没有更多信息(例如,Minimal, Complete, and Verifiable example),我只能提供建议。

标签: django database testing


【解决方案1】:

不确定这是否是您的问题的原因,但可能会导致一些问题。在我的 TestCase 类中,我通常定义 setUp(),但不定义 setUpClass。如果这样做,请确保调用 super 方法。来自the docs

警告

SimpleTestCase 及其子类(例如 TestCase,...)依赖于 setUpClass() 和 tearDownClass() 执行一些类范围 初始化(例如覆盖设置)。如果您需要覆盖 那些方法,别忘了调用超级实现

SimpleTestClass.setUpClass 方法负责建立数据库连接,因此如果不先调用它,您将不会访问测试数据库。

【讨论】:

  • 我不止一次使用在 setUpClass 中创建的对象。如果我使用 setUp 会导致数据库问题,因为它会尝试再次创建所有对象。
  • 我自己尽量避免这种情况,因为如果测试以意外的顺序运行(例如,在其中一个测试中发生更改的重用模型对象),可能会出现奇怪的测试问题,但我猜这并不能真正回答您的问题。
  • 似乎 django 创建了一个临时数据库,其中存储了所有对象。而且我无法通过我的主数据库访问它们。
  • 你没有说你试图通过主数据库访问它们。如果您在测试用例中使用User.objects.get() 之类的查询,则您正在查询临时数据库。
猜你喜欢
  • 2012-03-10
  • 2011-09-18
  • 2014-06-07
  • 2016-11-07
  • 2011-11-05
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多