我很想测试其他'这个功能的路径:
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();
});
答案 0 :(得分:0)
我想出来了。无论我在服务代码中出于何种原因,当我从同一个模块调用一个函数时,我必须“这个”#39;。所以在我的incrementCounter()函数中,else应该读取' this.initializeView()'而不是初始化视图()'。
如果有人可以向我解释为什么这种情况会很好 - 否则我希望这可以帮助别人。