我正在使用yoeman,grunt,angular,grunt-jasmine,karma,elasticsearch实现一个应用程序。我需要为我定制服务(命名为elasticSearchService)编写一个测试,它调用elasticsearch (elasticsearch.angular.js)来搜索一些东西并返回到一个promise,但是我不能模拟elasticsearch (esFactory)对象。
packages.json
"karma-jasmine": "^0.1.5",
"karma-phantomjs-launcher": "^0.1.4",bower.json
"elasticsearch": "~2.4.1",我的服务
angular
.module('tagsearchFrontendApp')
.factory('elasticSearchService', ['$q', 'esFactory',
function ($q, esFactory) {
var client = esFactory({
host: 'localhost:9200'
});
var search = function (term, offset) {
var deferred = $q.defer();
var query = {
'match': {
'_all': term
}
};
client.search({
'index': 'recipes',
'type': 'recipe',
'body': {
'size': 10,
'from': (offset || 0) * 10,
'query': query
}
}).then(function (result) {
console.log(result);
var ii = 0,
hits_in, hits_out = [];
hits_in = (result.hits || {}).hits || [];
for (; ii < hits_in.length; ii++) {
hits_out.push(hits_in[ii]);
}
deferred.resolve(hits_out);
}, deferred.reject);
return deferred.promise;
};
....我的测试
describe('elasticSearchService test', function () {
var _elasticSearchService, rootScope, q;
beforeEach(module('tagsearchFrontendApp'));
beforeEach(inject(['$q', '$rootScope', 'esFactory', 'elasticSearchService', function ($q, $rootScope, esFactory, elasticSearchService) {
_elasticSearchService = elasticSearchService;
rootScope = $rootScope;
q = $q;
spyOn(esFactory, "search").andCallFake(function () {
console.log("elasticsearch: fake search");
var deferred = $q.defer();
deferred.resolve('The fake search resolve');
console.log(deferred.promise);
return deferred.promise;
});
}]));
it('search okay', function () {
_elasticSearchService.search('Developer', 1).then(function(){
...
});
});
});在执行"grunt test“之后,出现了一条错误消息" search () method an not exist”,尽管我的应用程序可以正常地运行搜索功能,但使用的是elasicsearch工厂。你能帮我解决这个bug吗?
发布于 2014-09-25 10:17:19
您可以在配置时使用$provide将您的服务替换为模拟服务
describe('elasticSearchService test', function () {
var esMock;
var service;
beforeEach(module('tagsearchFrontendApp') , function ($provide){
$provide.factory('esFactory',function(){
return function(){
return esMock;
}
});
});
beforeEach(inject(function($q,elasticSearchService){
esMock={
search:function(){
return $q.when('The fake search resolve');
}
};
service=elasticSearchService;
}));
it('should search with elastic search',function(){
spyOn(esMock, 'search').andCallThrough();
_elasticSearchService.search('Developer', 1).then(function(result){
...
});
});
});你可能需要调用$rootScope.$apply()来解决你的测试中的promise it,这是不确定的。
发布于 2014-09-25 10:28:45
因为您创建了esFactory的一个实例,所以在一个原型函数中搜索函数。在您的间谍中执行以下操作
spyOn(esFactory.prototype, 'search')...你就可以开始做生意了。
另一个观察结果是,没有必要在您的服务中注入Q并进行延迟。您可以只返回由esFactory客户端搜索函数创建的promise,然后在处理程序中返回值,而不是解析延迟的值。
https://stackoverflow.com/questions/26028429
复制相似问题