Angularjs 基于范围值的单元测试指令单击事件
我有一个指令属性,它传递一个值并基于该值执行一个操作:Angularjs 基于范围值的单元测试指令单击事件,angularjs,unit-testing,angularjs-directive,jasmine,karma-jasmine,Angularjs,Unit Testing,Angularjs Directive,Jasmine,Karma Jasmine,我有一个指令属性,它传递一个值并基于该值执行一个操作: define(function () { 'use strict'; var myDirective = function ($rootScope, myFactory) { return { restrict: 'A', scope: { _myValue : '=value' }, link: function(scope, element
define(function () {
'use strict';
var myDirective = function ($rootScope, myFactory) {
return {
restrict: 'A',
scope: {
_myValue : '=value'
},
link: function(scope, element, attrs) {
element.bind('click', function() {
if (scope._myValue === 'red') {
myFactory.red();
}
if (scope._myValue === 'green') {
myFactory.green();
}
if (scope._myValue === 'black') {
myFactory.black();
}
});
}
};
};
return ['$rootScope', 'myFactory', myDirective];
});
HTML:
工厂示例:
define(['require', 'angular'], function (require, angular) {
'use strict';
var myFactory = function () {
return {
red: function() {
console.log('red');
},
green: function() {
console.log('green');
},
black: function() {
console.log('black');
}
};
};
return myFactory;
});
我会在每个之前的
中添加一个这样的间谍:
spyOn(myFactory, 'red');
然后检查是否已调用:
expect(myFactory.red).toHaveBeenCalled();
当然,您必须注入myFactory
谢谢,很好的解决方案。我必须定义我的工厂吗?间谍走在我前面吗?之后?声明一个myFactory
var,就像您对'scope所做的那样。然后,注入
\u myFactory\`并将其影响到myFactory
var:var myFactory=\u myFactory\
。就这样。然后,尽快放置spy(在编译之前slidingMenuFactory
应该是myFactory
。您的工厂是什么样子的?它可能是您需要使用“new myFactory()”创建的对象吗..?您正在使用模块加载器。有一些步骤需要遵循,以便您可以对工厂进行单元测试。请查看:。顺便说一句,这超出了该问题的范围。请发布另一个线程,并检查我的答案是否符合您(第一)的需要。
Error: spyOn could not find an object to spy upon for red()
define(['require', 'angular'], function (require, angular) {
'use strict';
var myFactory = function () {
return {
red: function() {
console.log('red');
},
green: function() {
console.log('green');
},
black: function() {
console.log('black');
}
};
};
return myFactory;
});
spyOn(myFactory, 'red');
expect(myFactory.red).toHaveBeenCalled();