【发布时间】:2015-01-30 11:42:46
【问题描述】:
在尝试为包含多个模块的 Google App Engine 应用编写一些 Python 单元测试时,我遇到了几个错误。
我一直在遵循https://cloud.google.com/appengine/docs/python/tools/localunittesting 上给出的指导
首先我得到了以下信息:
ERROR:root:AssertionError('No api proxy found for service "modules"',)
但是我确定这是因为我没有正确初始化 Testbed,需要单独调用:
self.testbed.init_modules_stub()
尽管已经调用了:
self.testbed.init_all_stubs()
这对我来说似乎很奇怪,但不是主要问题......现在我已经克服了这个错误,而是得到了:
错误:root:InvalidModuleError()
代码非常简单。以下是测试用例的相关部分:
def setUp(self):
self.testbed = testbed.Testbed()
self.testbed.activate()
self.testbed.init_all_stubs
self.testbed.init_modules_stub()
def test_should_submit_a_task(self):
post_content = '{ "bucket": "/test/", "filename", "test", "operation": "read" }'
request = webapp2.Request.blank('/path/to/module/method', POST=post_content)
response = request.get_response(main.application)
self.assertEquals(response.status_int, 200)
被测代码中抛出错误的行如下:
host = get_hostname(queue)
我可以看到“队列”已正确初始化为模块名称。
google_appengine 中的 cmets 来自 get_hostname() 状态:
“引发: 如果给定的模块版本无效,则 InvalidModuleError。"
所以由于某种原因我的模块版本无效。
那么,在测试代码时是否需要手动将模块版本传递给get_hostname()?
还是我未能以某种方式初始化测试平台以确保模块的版本有效?
编辑:我一直在努力解决这个问题,并通过 Google App Engine 代码跟踪到 request_info.py 中的 _LocalFakeDispatcher 类。该类设置了一些用于测试的默认值。问题是,我的测试到达这里试图确定模块是否有效,但它与此存根中的默认值之一不匹配,因此最终返回无效模块错误。
是否可以通过某种方式覆盖此调度程序中的默认值,以将其设置为填充预期的模块名称和版本?
见:
class _LocalFakeDispatcher(Dispatcher):
"""A fake Dispatcher implementation usable by tests."""
def __init__(self,
module_names=None,
module_name_to_versions=None,
module_name_to_default_versions=None,
module_name_to_version_to_hostname=None):
super(_LocalFakeDispatcher, self).__init__()
if module_names is None:
module_names = ['default']
if module_name_to_versions is None:
module_name_to_versions = {'default': ['1']}
etc. ...
非常感谢
R.
$gcloud --version 谷歌云 SDK 0.9.44
应用程序 2015.01.15 app-engine-go-darwin-x86_64 1.9.17 应用引擎 Java 1.9.17 app-engine-managed-vms 2014.11.03 应用引擎-python 1.9.17 等等
【问题讨论】: