簡體   English   中英

監視服務方法時,Jasmine單元測試失敗

[英]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);

我正在嘗試測試(使用茉莉花)

  • 實際上,通過validate方法調用validateRulesProvider上的getRules方法。
  • post參數通過所述方法返回的每個規則運行

我有以下茉莉花測試腳本:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM