我有一个Angular模块验证,声明如下:
(function(ns){
ns.validation = angular.module("validation", []);
})(blog);
该模块包含两个服务,validator和validationRulesProvider,如下所示:
(function(module){
module
.factory("validationRulesProvider", function(){
var _getRules = function() {
return [{
isValid: function(post) {
return post.length > 0;
}
}];
};
return {
getRules: _getRules
};
});
})(blog.validation);
和
(function(module){
module
.factory("validator", ["validationRulesProvider", function(validationRulesProvider){
var _validate = function(post) {
var rules = validationRulesProvider.getRules();
for (var rule in rules) {
if (!rule.isValid(post)) {
return false;
}
}
return true;
};
return {
validate: _validate
};
}]);
})(blog.validation);
我正在尝试测试(使用Jasmine)
我有以下Jasmine测试脚本:
describe("Validator: ", function(){
var _validator;
var _mockedValidationRulesProvider;
var _mockRule;
beforeEach(function(){
module("validation");
inject(function(validationRulesProvider){
_mockedValidationRulesProvider = validationRulesProvider;
});
_mockRule = jasmine.createSpy();
spyOn(_mockedValidationRulesProvider, "getRules")
.and
.returnValue([{
isValid: _mockRule
}]);
inject(function(validator){
_validator = validator;
});
});
describe("getRules - ", function(){
it("gets a collection of rules from the rules provider", function(){
_validator.validate("");
expect(_mockedValidationRulesProvider.getRules).toHaveBeenCalled();
});
it("should pass the post through each rule received from the rules provider", function(){
expect(_mockRule.calls.count()).toEqual(_mockedValidationRulesProvider.getRules().length);
});
});
});
所以,我只是想创建一个validateRulesProvider.getRules的虚假实现。我的麻烦是这两个测试都失败了。如果我改变了这条线:
spyOn(_mockedValidationRulesProvider, "getRules")
.and
.returnValue([{
isValid: _mockRule
}]);
只是
spyOn(_mockedValidationRulesProvider, "getRules")
.and
.returnValue([]);
然后两个测试中的第一个通过,因为将永远不会输入validator.validate中的循环。
Karma提供以下输出:
PhantomJS 1.9.8(Windows 7)验证程序:getRules - 从规则提供程序FAILED获取规则集合 TypeError:'undefined'不是函数(评估'rule.isValid(post)') 在C:/Users/User/JS/Angular/Learning/blogsite/scripts/validation/validator.js:8 在C:/Users/User/JS/Angular/Learning/blogsite/scripts/tests/validator.test.js:32 PhantomJS 1.9.8(Windows 7)验证器:getRules - 应该通过从规则提供程序收到的每个规则传递邮件FAILED 预期0等于1。 在C:/Users/User/JS/Angular/Learning/blogsite/scripts/tests/validator.test.js:37 PhantomJS 1.9.8(Windows 7):执行5 of 5(2次失败)(0秒/0.039秒)
我有点不知道为什么测试在第一个实例中失败,因为我似乎应该从间谍返回的是一个包含“isValid”函数的对象的数组 - 这是确切地说是从该函数的实际实现返回的内容。
我做错了什么?
答案 0 :(得分:2)
当你想在javascript中循环数组时,你需要使用javascript basic 'for loop'而不是'for-in loop'。
验证工厂中的代码应该是这样的。
for (var i = 0; i < rules.length; i++) {
var rule = rules[i];
if (!rule.isValid(post)) {
return false;
}
}