【发布时间】:2015-06-23 06:32:46
【问题描述】:
我正在使用 ES6 开发 AngularJS 应用程序,因此在迁移到 AngularJS 2.0 时我将尽可能少地工作
但我发现做单元测试有点复杂。
所以我想做的是测试指令的“控制器”(loginSidebarCtrl) 这是我的代码:(LoginSidebar.js)
class LoginSidebar {
constructor(loginSidebarService) {
this.loginSidebarService = loginSidebarService;
}
/*
... SOME METHODS ...
*/
}
LoginSidebar.$inject = ['loginSidebarService'];
export default function() {
return {
scope: {},
templateUrl: 'path/to/loginSidebar.tpl.html',
replace: true,
controller: LoginSidebar,
controllerAs: 'loginSidebarCtrl'
};
};
我的 app.js 看起来像这样
/*
...
import ...
...
*/
import loginSidebar from "./js/path/to/LoginSidebar.js";
import loginSidebarService from "./js/path/to/LoginSidebarService.js";
angular.module('myModule', [
'ngNewRouter',
'ngAnimate'
])
/*
...
.directive(...)
....
*/
.directive("loginSidebar", loginSidebar)
/*
...
.service(...)
....
*/
.service("loginSidebarService", loginSidebarService)
/*
.config(...);
*/
angular.module('booking', [
'ngNewRouter',
'ngAnimate',
'cross.ui',
'agenda.booking'
])
.directive("alerts", alerts)
.directive("breadcrumbs", breadcrumbs)
.directive("topHeader", topHeader)
.directive("loginSidebar", loginSidebar)
.service("loginHandler", loginHandler)
.service("userHandler", userHandler)
.service("familyMembersService", familyMembersService)
.service("loginSidebarService", loginSidebarService)
.service("alertsHandlerService", alertsHandlerService)
// name path to components dir and className
.config(function ($componentLoaderProvider) {
$componentLoaderProvider.setTemplateMapping(function (name) {
return 'page/booking/' + dotCase(name) + '.html';
});
$componentLoaderProvider.setCtrlNameMapping(function (name) {
return name[0].toUpperCase() + name.substr(1) + 'Ctrl';
});
})
// pretty URL
.config(function ($locationProvider) {
$locationProvider.html5Mode(true);
});
function dotCase(str) {
return str.replace(/([A-Z])/g, function ($1) {
return '.' + $1.toLowerCase();
});
}
这是我的 spec.js (Jasmine)
describe("Test", function(){
var el, scope;
beforeEach(function () {
module('myModule');
inject(function($compile, $rootScope){
el = angular.element("<login-sidebar></login-sidebar>");
$compile(el)($rootScope.$new());
$rootScope.$digest();
scope = el.isolateScope() || el.scope() ;
});
});
it("test", inject(function() {
console.log(scope);
}));
});
当我运行它时,我得到一个错误
“意外请求:GET .../.html”
但是当我不使用templateUrl(当我删除它或评论它时)它会按预期工作。
我怎样才能以某种方式忽略 templateUrl,这样当我想测试我的应用程序时,我就不必在每个文档中评论 templateUrl 了?
【问题讨论】:
-
我想你可能会考虑使用ng-html2js。它将在 Angular 的
$templateCache中加载模板并绕过任何对模板的 GET 请求。
标签: angularjs unit-testing ecmascript-6 karma-jasmine