我正在尝试编写一个我的AngularJS应用程序的端到端测试,在那里我检查当某个参数在URL中时,会发生一些事情。但是,$routeParams
是一个空对象。 This guy遇到了同样的问题。我正在尝试确定当?code=whatever
位于网址中时,某些文字会显示在用户界面中。我的应用程序正常运行,这条路线符合预期:
$routeProvider.when '/',
resolve:
redirect: ($location, $routeParams, $http, $cookieStore) ->
console.log $routeParams
code = $routeParams.code
console.log 'code: ' + code
if code
// do something
else
// do something else
当我通过Karma测试运行器访问test-index.html?code=123
时,在浏览器控制台中我看到:
Object {}
code: undefined
我希望在单元测试中模拟$routeParams
,但我认为端到端测试的功能与真实应用程序类似。当有一个URL参数时,为什么$routeParams
在我的测试中完全为空?
编辑:这是我的测试:
it 'fills in the input field when code is in URL', ->
browser().navigateTo '/base/test-index.html?code=123#/'
element('a.some-link').click()
expect(input('my_param.value').val()).toBe 'something that gets set when code in URL'
答案 0 :(得分:1)
$route
,$routeParams
和$location
的大部分功能都在“#”之后的网址上工作。因此,在您的示例“/base/test-index.html?code=123#/”中,angular只会在“#”之后看到“/”,没有别的,这就是为什么你得空$routeParams
。此外,您不应在解析功能中使用$routeParams
,而是使用$route.current.params
。
尝试更改
browser().navigateTo '/base/test-index.html?code=123#/'
到
browser().navigateTo '/base/test-index.html#/?code=123'
在redirect
console.log $route.current.params
答案 1 :(得分:0)
这感觉很糟糕,因为我正在改变实际情况以适应测试,因为AngularJS没有按照它应该填充$routeParams
。感谢this generic JavaScript solution,我将QueryString
添加到另一个JS文件中,并将其包含在我的app index.html和test-index.html中。然后,在我的routes.js中,我做code = $routeParams.code || QueryString.code
。因此,如果$routeParams
为空,这似乎只发生在测试中,那么?code=blah
参数值是通过良好的'JavaScript window.location
解析得到的。