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が返送されたように見えます。ブラウザはログインではなくルートにリダイレクトされます。これは、ログインが成功したことも示します。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のエンコードは、Cookieを使用してwebtest.TestAppで行われます。

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

私はそれが正しいと信じています。

私の推測では、応答側の何かがcookiesサーバー側の要求でCookieデータを誤って解析しています。しかし、何ですか?何か案は?

4

2 に答える 2

5

この問題は、WebTest を 1.2.1 から 1.2 にダウングレードすると解消されました。

于 2010-04-28T20:57:35.770 に答える
2

WebTest のバージョンに関係なく、問題が継続的に発生しました。しかし、いろいろいじった後、Cookie が最初に設定されたときは REMOTE_ADDR 値として 127.0.0.1 を使用していましたが、2 番目の要求では 0.0.0.0 に変更されたことに気付きました。

get リクエストを実行して 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 に答える