我为一个端点设置了一个超级简单的单元测试,该端点接受带有文件的POST请求,并在上传成功后将用户重定向到新页面。这个单元测试的目的是确保文件上传工作正常。
tests.py
c = Client()
with open('replays/static/test.txt', 'r', ) as f:
response = c.post(
'/upload/',
{
'summoner': 'test user',
'title': 'Testing title',
'replay': f
},
follow=False
)
print(response.status_code)
print(response.status_code == 302)
self.assertIs(response.status_code, 302)
$ python manage.py test replays
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
302
True
======================================================================
FAIL: test_create_replay (replays.tests.ReplayCreationTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/path/to/project/tests.py", line 52, in test_create_replay
self.assertIs(response.status_code, 302)
AssertionError: 302 is not 302
----------------------------------------------------------------------
Ran 1 test in 0.173s
FAILED (failures=1)
Destroying test database for alias 'default'...
如果我在调用测试客户端的post方法时更改以下重定向的参数,那么response_status为200
时一切都按预期工作tests.py - follow redirect
c = Client()
with open('replays/static/test.txt', 'r', ) as f:
response = c.post(
'/upload/',
{
'summoner': 'test user',
'title': 'Testing title',
'replay': f
},
follow=True
)
print(response.status_code)
print(response.status_code == 200)
self.assertIs(response.status_code, 200)
$ python manage.py test replays
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
200
True
.
----------------------------------------------------------------------
Ran 1 test in 0.196s
OK
Destroying test database for alias 'default'...
我错过了什么?这似乎不应该是断言语句的预期行为。我使用的是Django 3.1.
AssertIs
检查x is y
,即x
和y
是否指向同一个对象。但是你可以有两个int
对象,它们都是302
,但不是同一个对象。
应该使用.AssertEqual(…)
[Python-doc]:
self.assertEqual(302, response.status_code)
对于小整数,CPython解释器将为-5到256构造int对象,因此使用flyweight模式:
当前的实现为
-5
和256
之间的所有整数保持一个整数对象数组,当你在这个范围内创建一个int时,你实际上只是得到一个对现有对象的引用。
这意味着对于int
在-5和256之间,它将引用相同的对象,对于超出该范围的值,它通常构造一个新对象。