6

我在 Pylons 应用程序中运行单元测试以进行授权时遇到问题。似乎测试用例中设置的某些 cookie 可能没有正确写入或解析。使用浏览器访问应用程序时,Cookie 可以正常工作。

这是我在粘贴生成的 TestController 中的测试用例:

def test_good_login(self):
    r = self.app.post('/dologin', params={'login': self.user['username'], 'password': self.password})
    r = r.follow() # Should only be one redirect to root
    assert 'http://localhost/' == r.request.url
    assert 'Dashboard' in r

这应该测试现有帐户的登录是否将用户转发到仪表板页面。相反,发生的情况是用户被重定向回登录。第一个 POST 工作,在会话中设置用户并返回 cookie。尽管这些 cookie 是在后续请求中发送的,但它们似乎没有被正确解析。

我首先在上述方法的开头设置一个断点,然后查看登录响应返回什么:

> nosetests --pdb --pdb-failure -s foo.tests.functional.test_account:TestMainController.test_good_login
Running setup_config() from foo.websetup
> /Users/istevens/dev/foo/foo/tests/functional/test_account.py(33)test_good_login()
-> r = self.app.post('/dologin', params={'login': self.user['username'], 'password': self.password})
(Pdb) n
> /Users/istevens/dev/foo/foo/tests/functional/test_account.py(34)test_good_login()
-> r = r.follow() # Should only be one redirect to root
(Pdb) p r.cookies_set
{'auth_tkt': '"4c898eb72f7ad38551eb11e1936303374bd871934bd871833d19ad8a79000000!"'}
(Pdb) p r.request.environ['REMOTE_USER']
'4bd871833d19ad8a79000000'
(Pdb) p r.headers['Location']
'http://localhost/?__logins=0'

似乎创建了一个会话并发回了一个 cookie。浏览器被重定向到root,而不是登录,这也表明登录成功。如果我越过 follow(),我会得到:

> /Users/istevens/dev/foo/foo/tests/functional/test_account.py(35)test_good_login()
-> assert 'http://localhost/' == r.request.url
(Pdb) p r.request.headers
{'Host': 'localhost:80', 'Cookie': 'auth_tkt=""\\"4c898eb72f7ad38551eb11e1936303374bd871934bd871833d19ad8a79000000!\\"""; '}
(Pdb) p r.request.environ['REMOTE_USER']
*** KeyError: KeyError('REMOTE_USER',)
(Pdb) p r.request.environ['HTTP_COOKIE']
'auth_tkt=""\\"4c898eb72f7ad38551eb11e1936303374bd871934bd871833d19ad8a79000000!\\"""; '
(Pdb) p r.request.cookies
{'auth_tkt': ''}
(Pdb) p r
<302 Found text/html location: http://localhost/login?__logins=1&came_from=http%3A%2F%2Flocalhost%2F body='302 Found...y.  '/149>

这向我表明 cookie 是在请求​​中传递的,尽管存在可疑的转义。环境似乎没有根据先前请求创建的会话。cookie 已从标头复制到环境中,但请求中的 cookie 似乎设置不正确。最后,用户被重定向到登录页面,表明用户没有登录。

应用程序中的授权是通过 repoze.who 和 repoze.who.plugins.ldap 完成的,repoze.who_friendlyform 执行挑战。我正在使用tests.TestController粘贴创建的股票:

class TestController(TestCase):

    def __init__(self, *args, **kwargs):
        if pylons.test.pylonsapp:
            wsgiapp = pylons.test.pylonsapp
        else:
            wsgiapp = loadapp('config:%s' % config['__file__'])
        self.app = TestApp(wsgiapp)
        url._push_object(URLGenerator(config['routes.map'], environ))
        TestCase.__init__(self, *args, **kwargs)

顺便说一句,这是一个webtest.TestApp

cookie 的编码是在 webtest.TestApp 中使用 Cookie 完成的:

>>> from Cookie import _quote
>>> _quote('"84533cf9f661f97239208fb844a09a6d4bd8552d4bd8550c3d19ad8339000000!"')
'"\\"84533cf9f661f97239208fb844a09a6d4bd8552d4bd8550c3d19ad8339000000!\\""'

我相信这是正确的。

我的猜测是响应端的某些东西错误地将 cookie 数据解析到cookies服务器端请求中。但是什么?有任何想法吗?

4

2 回答 2

5

将 WebTest 从 1.2.1 降级到 1.2 后,此问题消失了。

于 2010-04-28T20:57:35.770 回答
2

无论 WebTest 的版本如何,我都会不断出现这个问题。然而,经过一番折腾后,我注意到当第一次设置 cookie 时,它​​使用 127.0.0.1 作为 REMOTE_ADDR 值,但在第二次请求时它更改为 0.0.0.0。

如果我做了获取请求并将 REMOTE_ADDR 设置为 127.0.0.1 一切都很好!

response = response.goto(url('home'), extra_environ=dict(REMOTE_ADDR='127.0.0.1'))
于 2010-06-05T06:43:55.597 回答