ui-router在控制器测试中导致“整页重载”?

时间:2014-01-06 22:16:17

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

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

Some of your tests did a full page reload!

我的测试运行httpMock.flush()

后,

karma / jasmine错误

通过从我的控制器中删除代码进行故障排除后,它一直是相应的测试,直到它通过,我发现如果我删除$ 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机制(我只是通过$状态)所以它不知道状态是什么因此触发$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

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

1 个答案:

答案 0 :(得分:1)

我认为你的测试不够集中,你实际上是在测试ui-router而不是你自己的代码。例如,我将隔离测试您的控制器,可能断言您的控制器正在暴露适当的值或api。

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