我正在通过创建一个TestCase来测试用户创建,但是在创建它之后就找不到了。
我尝试通过调用.refresh_from_db()
刷新缓存,但是它不起作用。
这是我的TestCase:
class SuperStrangeTest(TestCase):
def test_super_strange(self):
john = User.objects.create()
john.refresh_from_db()
print('!=====START' * 10)
print(User.objects.count())
print(User.objects.all())
self.assertIsNotNone(User.objects.filter().first()) # None of assertions below would be right
self.assertIsNotNone(User.objects.filter(id=john.id).first())
self.assertTrue(User.objects.filter(id=john.id).exists())
我运行此测试的命令是:
./manage.py test --noinput --failfast --keepdb links.tests.SuperStrangeTest.test_super_strange
有时结果是正确的,但是大多数情况下结果都是错误的。
Using existing test database for alias 'default'...
/Users/oldcai/.virtualenvs/web/lib/python3.7/site-packages/grequests.py:21: MonkeyPatchWarning: Patching more than once will result in the union of all True parameters being patched
curious_george.patch_all(thread=False, select=False)
System check identified no issues (0 silenced).
!=====START!=====START!=====START!=====START!=====START!=====START!=====START!=====START!=====START!=====START
1
<QuerySet [<User: >]>
F
======================================================================
FAIL: test_super_strange (links.tests.SuperStrangeTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/oldcai/programs/python/webproject/zine/links/tests.py", line 41, in test_super_strange
self.assertIsNotNone(User.objects.filter().first())
AssertionError: unexpectedly None
----------------------------------------------------------------------
Ran 1 test in 0.130s
FAILED (failures=1)
Preserving test database for alias 'default'...
其他行的错误:
======================================================================
FAIL: test_super_strange (links.tests.SuperStrangeTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/oldcai/programs/python/webproject/links/tests.py", line 35, in test_super_strange
self.assertTrue(User.objects.filter(id=john.id).exists())
AssertionError: False is not true
----------------------------------------------------------------------
======================================================================
FAIL: test_super_strange (links.tests.SuperStrangeTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/oldcai/programs/python/webproject/links/tests.py", line 35, in test_super_strange
self.assertTrue(User.objects.filter(id=john.id).exists())
AssertionError: False is not true
----------------------------------------------------------------------
答案 0 :(得分:0)
尝试填写您的模型字段。它是Django用户模型的基础-需要用户名和密码。同样要创建django用户-使用create_user
函数,该函数将为您哈希密码。尝试像这样更正您的代码:
...
john = User.objects.create_user(username='john', password='password')
...
答案 1 :(得分:0)
在更深入地诊断了此问题之后,看来该错误与我的DATABASE_ROUTERS
设置有关。
我正在将操作的读取部分路由到生产中的随机只读从数据库中,以平衡读取的负载。
在TestCase中,我将从属数据库的配置设置为与默认数据库相同。
DATABASE = {
'ENGINE': 'django.db.backends.postgresql',
'ATOMIC_REQUESTS': False,
'CONN_MAX_AGE': 0,
'NAME': 'test',
'USER': 'test',
'PASSWORD': 'test',
'HOST': '',
'PORT': '',
}
DATABASES = {
'default': DATABASE,
'replica1': DATABASE,
}
但是在replica1
数据库插入记录之后,它仍然无法立即用default
查询结果。
当路由器随机选择default
数据库作为要读取的数据库时,TestCase将通过,否则它将失败。