gpt4 book ai didi

python - Django 测试 : Faking User Creation

转载 作者:行者123 更新时间:2023-11-28 20:32:36 25 4
gpt4 key购买 nike

我想更好地编写这个测试:

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 注册测试中发现了这段代码,它实际上并没有“创建”用户:

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()

但是,对于我的需要来说,它可能太长了。我希望能够以某种方式“伪造”帐户创建。我在模拟和 stub 方面没有太多经验,所以任何帮助都可以。谢谢!

最佳答案

这两种方法正在测试不同的东西:

  1. 您的测试用例测试模型层——它会询问“如果我创建用户并保存它,是否会自动创建配置文件记录?”

    它不依赖于用户对象是如何创建的——通过管理 View ,或者用户注册 View ,或者管理命令——只要这个测试通过,你就知道任何创建用户的方法通过 ORM 将添加一个配置文件。

    它也不关心配置文件是如何创建的。它可以通过保存前信号、保存后信号、重写的 save() 方法中的某些代码或魔术。只要创建记录,测试就会通过。

  2. 您在 django-registration 中找到的代码正在测试 View 层。它正在调用一个特定的 View 函数,register,向它传递三个 URL 参数,并询问“user_registered 信号是否因该 View 而被触发?”

    此测试用例不考虑其他创建用户的方法;只是注册 View 。它不涉及任何其他创建用户的方法。

    它也不会查看配置文件是否已创建。它只想知道信号已被触发,而不管该信号在任何特定应用程序中实际做什么

有什么区别?

您的代码是集成测试的一个很好的例子——“我是否以正确的顺序将所有这些部分(模型、信号)放在一起以便创建配置文件?” -- 以及回归测试,以在未来向您发出信号,告诉您您是否做了任何破坏用户配置文件创建的事情。

django 注册代码是一个实际的单元测试。它非常谨慎地仅隔离 View 代码,以便在受控环境中调用它并询问一个简单的问题。

哪个更好?

在您的情况下,您可能不需要编写单元测试。 (虽然可能对此有很多争论;在某些方面这实际上是一个宗教问题)你想要一种方法来验证你放在一起的代码是否按照你期望的那样工作,你的测试是最好的方法。

不要担心实际创建用户——在测试运行期间,您在一个事务中执行所有操作,并且该事务会在测试方法完成后立即回滚。它甚至可能不会命中磁盘。而且,正如@Platinum Azure 所提到的,无论如何它都在测试数据库中。

关于python - Django 测试 : Faking User Creation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12633250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com