簡體   English   中英

Django AssertionError - 302 不是 302

[英]Django AssertionError - 302 is not 302

我為接受帶有文件的 POST 請求的端點設置了一個超級簡單的單元測試,並在成功上傳后將用戶重定向到新頁面。 本單元的目標是對其進行測試以確保文件上傳正常工作。

測試.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)

Output

$ 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 - 跟隨重定向

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)

Output

$ 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是否引用相同的 object。 但是您可以有兩個都是302int對象,但不是同一個 object。

您應該使用.AssertEqual(…) [Python-doc]

self.assertEqual(302, response.status_code)

對於小整數,CPython 解釋器將為 -5 到 256 構造 int 對象,因此使用享元模式

當前實現為-5256之間的所有整數保留了一個 integer 對象數組,當您在該范圍內創建一個 int 時,您實際上只是返回了對現有 object 的引用。

這意味着對於 -5 和 256 之間的int ,它將引用相同的 object,對於超出該范圍的值,它通常會構造一個新的 object。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM