【发布时间】:2013-12-24 08:53:01
【问题描述】:
我在我的应用程序中对路由器进行单元测试时遇到了一些麻烦,该应用程序是基于 Angular ui 路由器构建的。我要测试的是状态转换是否适当地改变了 URL(稍后会有更复杂的测试,但这就是我要开始的地方。)
这是我的应用程序代码的相关部分:
angular.module('scrapbooks')
.config( function($stateProvider){
$stateProvider.state('splash', {
url: "/splash/",
templateUrl: "/app/splash/splash.tpl.html",
controller: "SplashCtrl"
})
})
以及测试代码:
it("should change to the splash state", function(){
inject(function($state, $rootScope){
$rootScope.$apply(function(){
$state.go("splash");
});
expect($state.current.name).to.equal("splash");
})
})
关于 Stackoverflow(以及官方 ui 路由器测试代码)的类似问题建议将 $state.go 调用包装在 $apply 中就足够了。但是我已经这样做了,状态仍然没有更新。 $state.current.name 保持为空。
【问题讨论】:
-
好的,想通了(有点)。如果我定义一个模拟路由器,使用内联模板而不是模板 URL,则转换成功。
-
你能发布你的工作代码作为答案吗?
-
大约一年前我问过这个问题。我现在的看法是,解决这个问题的最好方法是在 Karma 中使用ng-template-to-js preprocessor。
-
更具体地说:问题是如果模板下载在测试中失败(即因为没有服务器),状态更改将失败。但是,除非您正在监视 $stateChangeError 事件,否则您不会看到该错误。尽管如此,由于状态改变失败,$state.current.name 不会被更新。
标签: javascript unit-testing angularjs angular-ui-router