簡體   English   中英

如何在 Django 中模擬用戶和請求

[英]How to mock users and requests in django

我有與請求對象或用戶對象交互的 Django 代碼。 例如類似的東西:

foo_model_instance = models.get_or_create_foo_from_user(request.user)

如果您要使用 django python shell 或單元測試進行測試,您會在那里傳遞什么? 這里只需要一個 User 對象就可以了,但對模擬請求對象的需求也經常出現。

對於外殼或單元測試:

  • 你如何模擬用戶?
  • 你如何模擬請求?

對於請求,我將使用 Django 中包含的RequestFactory

from django.test.client import RequestFactory
rf = RequestFactory()
get_request = rf.get('/hello/')
post_request = rf.post('/submit/', {'foo': 'bar'})

對於用戶,我會像@ozan 建議的那樣使用 django.contrib.auth.models.User 並且可能使用工廠男孩來提高速度(對於工廠男孩,您可以選擇不保存到數據庫)

你如何模擬用戶?

初始化一個django.contrib.auth.models.User對象。 User.objects.create_user使這變得容易。

你如何模擬請求?

初始化一個django.http.HttpRequest對象。

當然,根據您想要做什么,有快捷方式。 如果您只需要一個帶有指向user屬性的對象,只需創建一些東西(任何東西)並賦予它該屬性。

您可以按照 Anurag Uniyal 的建議推出自己的模擬,也可以使用模擬框架。

對於那些說你可以像在 Django 中一樣創建一個普通用戶的人的回應......我建議這違背了單元測試的意義。 單元測試不應該觸及數據庫,但是通過創建用戶,您已經更改了數據庫,因此我們為什么要模擬一個。

在這里閱讀模擬對象
http://en.wikipedia.org/wiki/Mock_object
http://www.mockobjects.com/

並使用此 python 庫來模擬用戶
http://python-mock.sourceforge.net/

否則你可以自己寫一個簡單的 User 類,以此為起點

class MockUser(object):
    def __call__(self, *args, **kwargs):
        return self

    def __getattr__(Self, name):
        return self

添加特定案例等

您不需要模擬用戶,因為您可以在測試中創建一個 - 測試完成后數據庫將被銷毀。

要模擬請求,請使用 Simon Willison 的這個片段

暫無
暫無

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

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