【问题标题】:Setting HttpReferrer In Unit Tests在单元测试中设置 HttpReferrer
【发布时间】:2020-05-28 04:37:36
【问题描述】:

在我的 view.py 中,我对几个连续的页面进行了以下检查:

if(request.META.get('HTTP_REFERER') != request.build_absolute_uri(reverse('page1'))):
            return redirect('page1')

这是在每个页面上执行的,检查用户是否从上一个页面重定向,因此(例如),如果用户尝试在地址栏中输入 page4 的 url,测试将失败,他将被发送到第 3 页,则该页测试将失败,他将回退到第 2 页,依此类推。

我这样做是因为我有几个页面链接在一起,用户必须连续访问这些页面。

当我想进行单元测试时,问题就来了。以下测试会抛出错误,因为它无法通过重定向测试,因此无法测试我尝试测试的页面的逻辑:

def test_user_information_updated_on_validation_success(self):
        user = User.objects.create_superuser('username')
        self.client.force_login(user)

        self.client.post(reverse('page_4'), {
            'exampleQuestion': 'exampleAnswer'
        })
        user.refresh_from_db()

        self.assertEqual(user.exampleform.somefield, 'exampleAnswer')

如何在单元测试中访问页面,就像它已被重定向一样。

谢谢。

【问题讨论】:

    标签: python django tdd django-testing django-tests


    【解决方案1】:

    测试客户端中的请求接受映射到 WSGI 环境变量的关键字。以 HTTP 开头并且都是大写的环境变量,破折号映射到下划线 - 是 Http 标头,所以简短的版本是我们可以这样设置 HTTP 标头:

    # Wrong: Generates absolute paths without hosts
    self.client.post(
        reverse('page_4'), {'exampleQuestion': 'exampleAnswer'},
        HTTP_REFERER=reverse('page_3')
    )
    

    编辑: 有点太简单了,因为HTTP的referrer是全限定的,所以我们需要:

    
    referer = 'http://testserver{}'.format(reverse('page_3'))
    self.client.post(
        reverse('page_4'), {'exampleQuestion': 'exampleAnswer'},
        HTTP_REFERER=referer
    )
    

    仅供参考:协议 (wsgi.scheme) 和主机名 (HTTP_SERVER) 来自 djang.test.client.RequestFactory._base_environ()。如果您使用修改过的客户端来更改服务器名称和/或协议,您应该相应地进行调整。在这种情况下,明智的做法是在修改后的测试客户端中覆盖 _base_environ 并从中派生值。

    【讨论】:

    • 谢谢。昨天我在尝试同样的事情,但在相反的后面没有 ,{}。我尝试了您的解决方案并得到了TypeError: unhashable type: 'dict'。我刚刚阅读了一些关于此的文章 (stackoverflow.com/questions/13264511/…),虽然我对它们有所了解,但我不明白为什么在这种情况下会抛出这个错误,或者更重要的是,如何解决它。如果您有更多见解,将不胜感激:) 谢谢。
    • 因为我打错了。在编辑中更正。此外,如果第 3 页不接受关键字参数,则可以省略 dict,但必须填写正确的关键字参数才能反转。
    • 更新:我没有考虑主机/方案。
    • 谢谢。这正是我所追求的。非常感谢
    猜你喜欢
    • 2012-03-26
    • 2016-11-03
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多