0

不要浪费你的时间阅读这个问题。下面已经回答了。

我的 settings.py 包含:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'foo.db',
        'TEST_NAME': 'thetest.db'
    }
}

在测试代​​码中是这一行:

allShoes = models.Shoe.objects.filter()

allShoes 应该包含对象,因为该表是由 views.py 填充的,但在代码中它是空的。我还在测试代码中放置了一个 set_trace() 来暂停它,并使用 sqlite3 程序验证 foo.db 包含对象,而不是 test.db。

我交替尝试从 django.test.TestCase 和 django.test.TransactionTestCase 派生我的模型类 Shoe。都没有奏效。

我在用着:

>>> django.VERSION
(1, 4, 3, 'final', 0)

(venv)bmac:ol b$ python
Python 2.7.2 (default, Jun 20 2012, 16:23:33) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin

对我做错了什么有任何想法吗?

编辑:澄清一下, foo.db 是空的,只是在运行测试之前由 syncdb 创建并且 test.db 不存在。我的测试是一个 Selenium 测试,它会调用一个视图(被测代码的一部分),然后在页面上单击两次。每次点击都有一个调用另一个视图的 AJAX 处理程序;该视图(更多正在测试的代码)在数据库中创建一个条目。因此,最后,在 DB 被测试运行程序销毁之前,应该在 DB 中单击两次。

编辑:我从 DATABASES 中删除了 TEST_NAME 以使问题更简单,尽管我没有看到行为上的差异。在运行测试时,从我的视图代码中我可以运行:

models.Shoe.objects.using('default').all()

并查看对象。但是,在我的测试例程中,相同的语句会生成一个空列表。

4

2 回答 2

1

当 Django 测试运行器执行时,不会触及生产数据库。在我们的问题中,foo.db您的生产数据库和 Django 是否确保在您运行单元测试时不会触及这一点。相反,它将创建一个数据库,仅用于运行测试。通常这将是一个用于 sqlite 的内存数据库,但由于您已在 中指定TEST_NAMEsettings.py因此测试数据库将是一个名为 的磁盘数据库thetest.db

除非您在测试中调用视图代码以在测试期间填充记录,否则thetest.db.

测试用例可能看起来像这样。

from django.test import TestCase

class MyTest(TestCase):

    def test_something(self):
        # Simulate a browser POST which would populate an object in Shoes.
        # When the test starts, the db is empty.
        response = self.client.post('/shoe/add/', {
            # Post data here.
        })

        self.assertEqual(
            1,
            models.Shoe.objects.count())
于 2013-02-26T03:51:53.103 回答
0

我还没有确认这个解决方案,但不希望人们花时间阅读这个问题。我相信问题的出现是因为我从我的测试代码中运行 Django 开发服务器,以便我可以模拟连接不稳定。这导致使用生产数据库,并解释了为什么测试数据库为空。哦。

于 2013-02-26T17:47:33.670 回答