spyOn没有正确地模拟函数

时间:2017-07-23 20:03:09

标签: angularjs unit-testing jasmine

我很想测试其他'这个功能的路径:

    function incrementCounter(){
        var deferred = $q.defer();
        if(this.momentArray.length > 0) {
            //IF PATH OMITTED
        }
        else {
            console.log("ELSE");
            initializeView().then(function(moments) {
                deferred.resolve(moments);
            }, function(error) {
                deferred.reject();
            });
        }
        return deferred.promise;
    };

这是我的测试:

it('Should call incrementCounter momentArray is NOT populated', function() {
    console.log("UN POPULATED");
    service.momentArray = [];
    spyOn(service, "initializeView").and.callFake(function() {
        console.log("TEST");
        var deferred = $q.defer();
        deferred.resolve("MOCK");
        return deferred.promise;
    });

    service.incrementCounter().then(function(result) {
        console.log(result);
    });
    expect(service.initializeView).toHaveBeenCalled();
    // $scope.$apply();
});

我想嘲笑" initializeView函数调用。如果调用initializeView函数,测试应该通过,因为这将证明它沿着正确的路径走。

期望保持失败声称该功能未被调用。我将一个控制台日志放在initializeView函数中,并且该日志正在注销:

   function initializeView() {
    console.log("INITIALIZE VIEW");
    var deferred = $q.defer();
    //Omitted
    };

这告诉我,不知何故' initializeView'因某种原因没有被嘲笑。是否有人知道我做错了什么?

编辑:

添加范围。$ apply并使函数异步。

it('Should call incrementCounter momentArray is NOT populated', function(done) {
    console.log("UN POPULATED");
    service.momentArray = [];
    spyOn(service, "initializeView").and.callFake(function() {
        console.log("TEST");
        var deferred = $q.defer();
        deferred.resolve("MOCK");
        return deferred.promise;
    });

    service.incrementCounter().then(function(result) {
        console.log(result);
    });
    expect(service.initializeView).toHaveBeenCalled();
    $scope.$apply();
});

1 个答案:

答案 0 :(得分:0)

我想出来了。无论我在服务代码中出于何种原因,当我从同一个模块调用一个函数时,我必须“这个”#39;。所以在我的incrementCounter()函数中,else应该读取' this.initializeView()'而不是初始化视图()'。

如果有人可以向我解释为什么这种情况会很好 - 否则我希望这可以帮助别人。