[英]Jasmine test runs in grunt but fails in browser when spying $.get
[英]Jasmine unit test fails when spying on a service method
我有一個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);
我正在嘗試測試(使用茉莉花)
我有以下茉莉花測試腳本:
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);
});
});
});
因此,我只是試圖創建一個validationRulesProvider.getRules的虛假實現。 我的麻煩是這兩個測試都失敗了。 如果我更改行:
spyOn(_mockedValidationRulesProvider, "getRules")
.and
.returnValue([{
isValid: _mockRule
}]);
簡直是
spyOn(_mockedValidationRulesProvider, "getRules")
.and
.returnValue([]);
然后兩個測試中的第一個通過,因為validator.validate中的循環將永遠不會進入。
業力給出以下輸出:
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 at 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之5(2失敗)(0秒/ 0.039秒)
我有點茫然,為什么測試第一次失敗,因為似乎我應該從間諜那里返回的是一個包含“ isValid”函數的對象的數組-正是這樣從該函數的實際實現返回。
我究竟做錯了什么?
當您要使用javascript循環數組時,需要使用javascript基本的'for循環'而不是'for-in循環' 。
驗證器工廠中的代碼應如下所示。
for (var i = 0; i < rules.length; i++) {
var rule = rules[i];
if (!rule.isValid(post)) {
return false;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.