【发布时间】:2018-02-12 06:26:36
【问题描述】:
我想测试一下这个功能:
function initializeView() {
var deferred = $q.defer();
if(this.momentArray) {
core.listMoments(constants.BEST_MOMENT_PREFIX, '').then(function(moments) {
//Ommitted
deferred.resolve(moments);
}, function(error) {
console.log("ERROR");
deferred.reject(error);
});
}
else {
deferred.resolve();
}
return deferred.promise;
};
函数调用core.listMoments:
function listMoments(prefix, startAfter) {
// var deferred = $q.defer();
var promises = [];
return awsServices.getMoments(prefix, startAfter).then(function(moments) { //Mocked
console.log("getMoments Returned"); //Does not print
for(var i = 0; i < moments.length; i++) {
// moments[i].Key = constants.IMAGE_URL + moments[i].Key;
promises.push(getMomentMetaData(moments[i]));
}
return $q.all(promises);
});
};
这是我的测试函数:
it('Should correctly initialize the view', function(done) {
spyOn(awsServices, 'getMoments').and.callFake(function() {
console.log("getMoments Has been mocked"); //This prints
return $q.resolve(mock_moment);
});
service.initializeView().then(function() {
done();
})
});
问题在于 awsServices 的“getMoments”模拟。对 awsServices.getMoments 的调用位于 listMoments 函数中。我想模拟这个函数,但是当我这样做时,它并没有执行承诺的“then”部分。
因此,根据我的控制台日志,它会打印“getMoments 已被模拟”日志,但不会打印“getMoments Returned”日志。所以这个函数被模拟了,但由于某种原因它没有进入 then 语句,我的测试只是超时了。
【问题讨论】:
-
getMoments将返回mock_moments,但在getMoments的getMoments的listMoments函数中,它将每个时刻数据传递给getMomentMetaData(我怀疑你还需要模拟这个方法,如果它正在执行实际的 ajax)。 -
你的权利,我确实需要嘲笑它,但它现在甚至没有得到它。
-
你可以直接模拟
core.listMoments来验证initializeView函数的行为。并单独测试listMoments。 -
我可以,不过我想把它作为一个集成测试。
标签: javascript angularjs unit-testing jasmine