我正在尝试编写一些角度控制器测试,但遇到了:
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
我实现了该问题中提到的状态模拟方法,单元测试现在通过了。
答案 0 :(得分:1)
我认为你的测试不够集中,你实际上是在测试ui-router而不是你自己的代码。例如,我将隔离测试您的控制器,可能断言您的控制器正在暴露适当的值或api。
尽管如此,您可以将视图期望存根以满足$ templateCache调用ui-router将遍历到您的嵌套状态。我在这里摆弄你的代码并测试通过:http://plnkr.co/edit/hjw599oXGCjY03nbVpSN?p=preview