このテストをより適切に記述したい:
def test_profile_created(self):
self.client.post(reverse('registration_register'), data={
'username':'ygam',
'email':'ygam@example.com',
'password1':'ygam',
'password2':'ygam'
})
"""
Test if a profile is created on save
"""
user = User.objects.get(username='ygam')
self.assertTrue(UserProfile.objects.filter(user=user).exists())
そして、実際にはユーザーを「作成」しないdjango-registrationテストでこのコードに出くわしました:
def test_registration_signal(self):
def receiver(sender, **kwargs):
self.failUnless('user' in kwargs)
self.assertEqual(kwargs['user'].username, 'bob')
self.failUnless('request' in kwargs)
self.failUnless(isinstance(kwargs['request'], WSGIRequest))
received_signals.append(kwargs.get('signal'))
received_signals = []
signals.user_registered.connect(receiver, sender=self.backend.__class__)
self.backend.register(_mock_request(),
username='bob',
email='bob@example.com',
password1='secret')
self.assertEqual(len(received_signals), 1)
self.assertEqual(received_signals, [signals.user_registered])
ただし、彼はこの「_mock_request」にカスタム関数を使用しました。
class _MockRequestClient(Client):
def request(self, **request):
environ = {
'HTTP_COOKIE': self.cookies,
'PATH_INFO': '/',
'QUERY_STRING': '',
'REMOTE_ADDR': '127.0.0.1',
'REQUEST_METHOD': 'GET',
'SCRIPT_NAME': '',
'SERVER_NAME': 'testserver',
'SERVER_PORT': '80',
'SERVER_PROTOCOL': 'HTTP/1.1',
'wsgi.version': (1,0),
'wsgi.url_scheme': 'http',
'wsgi.errors': self.errors,
'wsgi.multiprocess':True,
'wsgi.multithread': False,
'wsgi.run_once': False,
'wsgi.input': None,
}
environ.update(self.defaults)
environ.update(request)
request = WSGIRequest(environ)
# We have to manually add a session since we'll be bypassing
# the middleware chain.
session_middleware = SessionMiddleware()
session_middleware.process_request(request)
return request
def _mock_request():
return _MockRequestClient().request()
ただし、私のニーズには長すぎる機能かもしれません。どうにかしてアカウント作成を「偽装」できるようにしたいです。私はモックとスタブの経験があまりないので、どんな助けでも構いません。ありがとう!