微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django 断言错误 - 302 不是 302

如何解决Django 断言错误 - 302 不是 302

我为接受带有文件的 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 方法时更改了以下重定向的参数,则响应状态为 200 时一切都按预期工作

tests.py - 跟随重定向

c = Client()
    with open('replays/static/test.txt',) as f:
        response = c.post(
            '/upload/',{
                'summoner': 'test user','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,换句话说,xy 是否引用 相同 对象。但是您可以有两个 int 对象,它们都是 302,但不是同一个对象。

你应该使用.AssertEqual(…) [Python-doc]

self.assertEqual(302,response.status_code)

对于小整数,CPython 解释器将为 -5 到 256 构造 int 对象,从而使用享元模式

当前的实现为 -5256 之间的所有整数保留了一个整数对象数组,当您在该范围内创建一个 int 时,您实际上只是返回对现有对象的引用。>

这意味着对于 -5 到 256 之间的 int,它将引用相同对象,对于该范围之外的值,它通常会构造一个新对象。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。