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

Hom*_*man 5 jasmine angularjs karma-runner angular-ui-router

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

Some of your tests did a full page reload!

我的测试运行时,karma/jasmine错误 httpMock.flush()

通过从我的控制器中删除代码进行故障排除后,它一直是相应的测试,直到它通过,我发现如果我删除$ state依赖,测试将通过,所以错误与ui-router有某种关系.

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

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

$ 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

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

Son*_*Nun 1

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

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