web-dev-qa-db-ja.com

djangoでユーザーとリクエストをモックする方法

Django=リクエストオブジェクトまたはユーザーオブジェクトとやり取りするコードがあります。たとえば次のようなものです:

foo_model_instance = models.get_or_create_foo_from_user(request.user)

Django python Shellまたはunittestでテストする場合、ここで何を渡しますか?ここでは単にUserオブジェクトが実行しますが、モックリクエストオブジェクトの必要性も頻繁に発生します。

シェルまたは単体テストの場合:

  • ユーザーをどのようにモックしますか?
  • どのようにリクエストをモックしますか?
65
Purrell

リクエストには、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を使用し、おそらく factory boy で速度を上げます(工場の少年では、DBに保存しないように選択できます)

67
naoko

ユーザーをどのようにモックしますか?

Django.contrib.auth.models.Userオブジェクトを初期化します。 User.objects.create_user はこれを簡単にします。

どのようにリクエストをモックしますか?

Django.http.HttpRequest オブジェクトを初期化します。

もちろん、やりたいことに応じてショートカットがあります。ユーザーを指すuser属性を持つオブジェクトが必要な場合は、何か(何でも)を作成して、その属性を指定します。

47
ozan

Anurag Uniyalが提案したように、独自のモックを転がすか、モックフレームワークを使用することができます。

とにかくDjangoでやるのと同じように普通のユーザーを作成することができるという発言に応えて...これは単体テストのポイントを破ることをお勧めします。単体テストはデータベースに触れるべきではありませんが、ユーザーを作成することでデータベースを変更しているため、データベースをモックする必要があります。

7

モックオブジェクトについてはこちらをご覧ください
http://en.wikipedia.org/wiki/Mock_object
http://www.mockobjects.com/

そして、これを使用してpython libユーザーをモックする
http://python-mock.sourceforge.net/

それ以外の場合は、簡単なUserクラスを自分で記述できます。これを出発点として使用します

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

    def __getattr__(Self, name):
        return self

特定のケースなどを追加する

6
Anurag Uniyal

ユーザーをモックする必要はありません。テスト内でユーザーを作成するだけなので、テストが終了するとデータベースは破棄されます。

リクエストをモックするには、Simon Willisonの this snippet を使用します。

5
Daniel Roseman