当我尝试为由多个模块组成的 Google App Engine 应用程序编写一些 Python 单元测试时,我一直在努力解决一些错误。
我一直遵循以下指导https://cloud.google.com/appengine/docs/python/tools/localunittesting https://cloud.google.com/appengine/docs/python/tools/localunittesting
首先我得到以下信息:
ERROR:root:AssertionError('未找到服务“模块”的 api 代理',)
但我确定这是因为我没有正确初始化 Testbed,需要单独调用:
self.testbed.init_modules_stub()
尽管已经调用了:
self.testbed.init_all_stubs()
这对我来说似乎很奇怪,但这不是主要问题......现在我已经克服了这个错误,相反我得到了:
错误:根: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)
我可以看到“队列”已使用模块名称正确初始化。
get_hostname() 中的 google_appengine 中的注释指出:
“加薪:
如果给定的模块版本无效,则出现 InvalidModuleError 错误。”
因此由于某种原因我的模块版本无效。
那么,在测试代码时是否需要手动将模块版本传递给 get_hostname() 呢?
或者我是否未能以某种方式初始化测试台以确保模块的版本有效?
EDIT:我继续研究这个问题,并通过 Google App Engine 代码追踪到该类_LocalFakeDispatcher
in request_info.py
。该类设置了一些用于测试的默认值。问题是,我的测试到达这里试图确定模块是否有效,但它与此存根中的默认值之一不匹配,因此最终返回无效模块错误。
有什么方法可以覆盖此调度程序中的默认值,以将其设置为填充预期的模块名称和版本?
See:
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 --版本 Google Cloud SDK 0.9.44
应用程序 2015.01.15
应用程序引擎-go-darwin-x86_64 1.9.17
应用程序引擎java 1.9.17
应用程序引擎管理的虚拟机 2014.11.03
应用程序引擎-python 1.9.17
ETC。