elasticsearch,jasmine,karma-runner,Angularjs,Unit Testing,elasticsearch,Jasmine,Karma Runner" /> elasticsearch,jasmine,karma-runner,Angularjs,Unit Testing,elasticsearch,Jasmine,Karma Runner" />

Angularjs jasmine不能模仿elasticsearch对象

Angularjs jasmine不能模仿elasticsearch对象,angularjs,unit-testing,elasticsearch,jasmine,karma-runner,Angularjs,Unit Testing,elasticsearch,Jasmine,Karma Runner,我正在使用yoeman、grunt、angular、grunt jasmine、karma、elasticsearch实现一个应用程序。我需要为我的定制服务名称elasticSearchService编写一个测试,它调用elasticsearch elasticsearch.angular.js来搜索某些东西并返回到承诺,但我不能模拟elasticsearch esFactory对象 packages.json bower.json 我的服务 执行grunt测试后,错误消息occurs sear

我正在使用yoeman、grunt、angular、grunt jasmine、karma、elasticsearch实现一个应用程序。我需要为我的定制服务名称elasticSearchService编写一个测试,它调用elasticsearch elasticsearch.angular.js来搜索某些东西并返回到承诺,但我不能模拟elasticsearch esFactory对象

packages.json bower.json 我的服务 执行grunt测试后,错误消息occurs search方法不存在,尽管我的应用程序运行的搜索功能与elasicsearch工厂一致。您能帮我解决这个错误吗?

您可以在配置时使用$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来解决测试中的问题,但不确定。

因为您在原型函数中创建了esFactory的一个实例。在您的间谍中,请执行以下操作

spyOn(esFactory.prototype, 'search')...
你就可以做生意了


另一个观察结果是,没有必要在服务中注入q并进行延迟。您只需返回由esFactory客户端搜索函数创建的承诺,然后在处理程序中返回值,而不是解析延迟值

你是想监视elasticSearchService而不是esFactory吗?你能发布准确的错误消息吗?不,我的意思是监视esFactory,因为我的服务elasticSearchService从elasticsearch.angular.js注入esFactory并调用其搜索功能。错误消息为搜索方法不存在类型错误:“undefined”不是计算“esMock”的对象。你能更详细地说明一下吗?请看编辑。如果没有实际运行的代码,很难发现此类问题。是该技术的一个工作示例感谢您的反馈,但这里有一个特例:var client=esFactory{host:'localhost:9200'};。按照您的建议修改源代码后,新的错误消息是[object object]“不是计算'esFactory{host:'localhost:9200'}的函数”。请参阅编辑。当然,您的模拟必须遵循与实际函数相同的接口:您的esFactory返回一个返回服务的函数。使用搜索函数,您的模拟必须相同。但我认为您可以自己解决这些错误!
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(){
       ...
    });
  });
});
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){
           ...
        });
    });
});
spyOn(esFactory.prototype, 'search')...