【发布时间】: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