【问题标题】:ui-router causing "full page reload" in controller test?ui-router 在控制器测试中导致“整页重新加载”?
【发布时间】:2014-01-06 22:16:16
【问题描述】:

我正在尝试编写一些角度控制器测试,但遇到了:

Some of your tests did a full page reload!

我的测试运行后,业力/茉莉花错误httpMock.flush()

在通过从我的控制器中删除代码进行故障排除之后,它是相应的测试,直到它通过为止,我发现如果我删除了 $state 依赖项,测试就会通过,因此该错误与 ui-router 有某种关系。

经过更多挖掘,它似乎与在我的路由文件中包含 $urlRouterProvider 有关:

App.config(function($stateProvider, $urlRouterProvider) {
 // For any unmatched url, redirect to
 $urlRouterProvider.otherwise('dashboard');

$urlRouterProvider 产生 window.location。如果我删除 $urlRouterProvider.otherwise 行,我可以放回 $state 并且测试通过。

编辑:

经过更多挖掘。

我最终发现我们正在$rootScope.$on('$stateChangeStart') 的其他地方进行整页重定向,以检查是否存在 cookie 或注销用户。

但即使将其注释掉,我也会收到一个新错误:对仪表板视图模板的意外 GET 请求。我想也许我的测试没有将任何值传递给 ui-router 机制(我只是通过 $state)所以它不知道状态是什么,因此触发了$urlRouterProvider.otherwise 路由。所以我在测试中添加了state.transitionTo('base.settings.sales-channels.edit', {channelId:1});。这是一个嵌套状态。

这确实将错误消息更改为Error: Unexpected request: GET ../src/settings/index.tpl.html,它看起来像是父状态的模板,因为settings 位于sales-channels 之前,在我的状态名称中位于edit 之前。

为什么会出现此错误?我们是否必须模拟出对所有父状态模板的期望?

编辑

这是一个 plunkr,它重现了我得到的测试错误 http://plnkr.co/edit/DoaIBqK1JMqbTJj3vlmH?p=preview

编辑

看起来模板 GET 请求是一个已知问题:https://github.com/angular-ui/ui-router/issues/212

我实现了那个问题中提到的状态模拟方法,现在单元测试通过了。

【问题讨论】:

    标签: angularjs jasmine angular-ui-router karma-runner


    【解决方案1】:

    我认为您的测试不够集中,您实际上是在测试 ui-router 而不是您自己的代码。例如,我会单独测试您的控制器,可能会断言您的控制器正在公开适当的值或 api。

    尽管如此,您可以存根视图期望以满足 ui-router 将进行的 $templateCache 调用以遍历您的嵌套状态。我在这里修改了你的代码并通过了测试:http://plnkr.co/edit/hjw599oXGCjY03nbVpSN?p=preview

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 2019-10-28
      • 2014-10-10
      • 1970-01-01
      相关资源
      最近更新 更多