测试webapp2:无法识别登录

时间:2015-11-09 18:12:28

标签: python google-app-engine webapp2

我在app.yaml

中有以下内容
handlers:
- url: /.*
  script: app.application
  secure: always
  login: required

运行测试时,我正按照谷歌的建议使用此testrunner

class SearchTest(unittest.TestCase):
    def setUp(self):

        # Set up app simulator
        app = webapp2.WSGIApplication([('/search', search.Search)], debug=True)
        self.testapp = webtest.TestApp(app)

        # Google testbed
        self.testbed = testbed.Testbed()
        self.testbed.activate()

        self.testbed.init_user_stub()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_memcache_stub()

        # Disable caching to prevent data from leaking between tests
        ndb.get_context().set_cache_policy(False)


    def testNotLoggedin(self):
        # Test user is redirected to login when not logged in

        assert not users.get_current_user()

        response = self.testapp.get('/search')
        self.assertEqual(response.status_int, 302)
        assert response.headers['Location']

testNotLoggedIn以200!= 302失败。所以即使需要登录,似乎仍然允许用户访问。这让我觉得app.yaml在测试中不被认可?

如何确认app.yaml已被识别且用户需要登录?

1 个答案:

答案 0 :(得分:0)

此测试代码绕过app.yaml调度。在App Engine上(以及在开发服务器中),HTTP请求通过app.yaml路由到WSGI应用程序实例,处理login: required的前端逻辑在调用请求处理程序之前发生。在此测试代码中,您将直接转到WSGI应用程序:self.testapp.get('/search')只是调用WSGI应用程序自己的内部URL映射来访问search.Search请求处理程序。

您要测试的条件更像是集成测试,并且需要运行的开发服务器或部署的App Engine测试版本。这是一个好主意,它比testbed等人能做的要大。