AngularJS e2e测试 - $ routeParams总是空的

时间:2013-10-25 15:18:08

标签: angularjs testing karma-runner angularjs-e2e

我正在尝试编写一个我的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'

2 个答案:

答案 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解析得到的。