Django=リクエストオブジェクトまたはユーザーオブジェクトとやり取りするコードがあります。たとえば次のようなものです:
foo_model_instance = models.get_or_create_foo_from_user(request.user)
Django python Shellまたはunittestでテストする場合、ここで何を渡しますか?ここでは単に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を使用し、おそらく factory boy で速度を上げます(工場の少年では、DBに保存しないように選択できます)
ユーザーをどのようにモックしますか?
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 libユーザーをモックする
http://python-mock.sourceforge.net/
それ以外の場合は、簡単なUserクラスを自分で記述できます。これを出発点として使用します
class MockUser(object):
def __call__(self, *args, **kwargs):
return self
def __getattr__(Self, name):
return self
特定のケースなどを追加する
ユーザーをモックする必要はありません。テスト内でユーザーを作成するだけなので、テストが終了するとデータベースは破棄されます。
リクエストをモックするには、Simon Willisonの this snippet を使用します。