Angularjs 如何在角度指令中测试控制器
我正在编写指令,希望添加单元测试。 我想编写测试: 它“当指令被创建时消息变量被定义” 它“当创建指令时,它不包含任何消息” 它“当调用消息时,它将向堆栈中添加新消息” 我的指令代码如下Angularjs 如何在角度指令中测试控制器,angularjs,angularjs-directive,jasmine,Angularjs,Angularjs Directive,Jasmine,我正在编写指令,希望添加单元测试。 我想编写测试: 它“当指令被创建时消息变量被定义” 它“当创建指令时,它不包含任何消息” 它“当调用消息时,它将向堆栈中添加新消息” 我的指令代码如下 app.directive("message", function () { return { transclude: false, require: '^ngModel', templateUrl: 'notificationBar.html', scope: {
app.directive("message", function () {
return {
transclude: false,
require: '^ngModel',
templateUrl: 'notificationBar.html',
scope: {
message: '@'
},
controller: function ($scope) {
$scope.messages = [];
$scope.addMessage=function(message){
$scope.messages.push(message);
}
}
}
})
和我的测试,但我不知道为什么这不起作用
describe("messageSpec", function(){
var element;
var $scope;
var ctrl;
beforeEach(module(app));
beforeEach(inject(function($compile, $controller, $rootScope){
var elm = angular.element(' <div data-message data-message="{{ message }}" >');
$scope = $rootScope;
element = $compile(elm)($scope);
$scope.$digest();
ctrl = element.controller("message");
}));
describe("test", function(){
it('When directive is created messages variable is defined', function(){
spyOn(ctrl,messages);
expect(ctrl.messages).toBeDefined();
});
it('When directive is created it contains no messages',function(){
spyOn(ctrl,messages);
expect(ctrl.messages.length).toBe(0);
});
it('When message is called it will add new message to stack', function(){
// todo
});
});
})这是一些需要考虑的事情。 $scope.addMessagemessage{..处的控制器函数中存在语法错误,因此我只是猜测并修复它。 在控制器中,消息被放入$scope中,而不是控制器实例本身,但在测试用例中,您在控制器实例中查找消息。 message指令有一个独立的作用域,因此传递到$compile中的$scope不能针对这两个指令进行测试。 作为一种解决方法,您可以使用angular.element…isolateScope来获取用于测试的隔离范围。 工作测试用例应如下所示:
describe("messageSpec", function() {
var element;
var $scope;
var isolateScope;
beforeEach(module("myApp"));
beforeEach(inject(function($compile, $controller, $rootScope) {
var elm = angular.element('<div data-message="{{ message }}">');
$scope = $rootScope;
element = $compile(elm)($scope);
$scope.$digest();
isolateScope = element.isolateScope();
}));
describe("test", function() {
it('When directive is created messages variable is defined', function() {
expect(isolateScope.messages).toBeDefined();
});
it('When directive is created it contains no messages', function() {
expect(isolateScope.messages.length).toBe(0);
});
it('When message is called it will add new message to stack', function() {
// todo
});
});
});
有关完整示例,请参见:在预览中,我得到错误:模块未定义。你知道为什么吗?你在我的plunker中看到错误了吗?它对我来说很好。如果是,你使用的是哪个浏览器?我使用的是chrome,得到的错误是:ReferenceError:module未在套件中定义。模块变量来自Angle-mocks.js。请检查devtools中的“网络”选项卡,以确保成功加载文件。