Django测试:虚假用户创建

2024-10-03 00:25:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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在注册时生成的代码”

^{pr2}$

但是他使用了一个自定义函数来处理这个“_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()

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


Tags: selfwsgiobjectsserverrequestsessiondefenviron
2条回答

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

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

    它不依赖于用户对象是如何通过管理视图、用户注册视图或管理命令创建的只要这个测试通过,您知道通过ORM创建用户的任何方法都会添加一个配置文件。在

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

  2. 在django注册中找到的代码正在测试视图层。它调用一个特定的视图函数register,传递给它三个URL参数,并询问问题“这个视图是否触发了user_registered信号?”在

    这个测试用例不关注其他创建用户的方法;只关注registration视图。它与创建用户的任何其他方法无关。在

    它也不考虑是否创建了配置文件。它只想知道信号是被触发的,而不管这个信号在任何特定的应用程序中究竟做了什么。

有什么区别?

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

django注册码是一个实际的单元测试。它非常小心地将视图代码隔离开来,以便在受控环境中调用它并提出一个简单的问题。在

哪个更好?

在您的情况下,您可能不需要编写单元测试。(虽然可能会有很多争论,但在某些部分实际上是宗教信仰的问题)您需要一种方法来验证您所编写的代码是否如您所期望的那样工作,而您的测试就是最好的方法。在

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

为什么要模仿用户创建?如果您运行Django的测试引擎,那么您将针对测试数据库进行测试。只需调用视图或使用请求客户机工厂,并在测试完成后让测试运行程序删除测试数据库。在

相关问题 更多 >