首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jasmine无法模拟elasticsearch对象

jasmine无法模拟elasticsearch对象
EN

Stack Overflow用户
提问于 2014-09-25 08:02:43
回答 2查看 687关注 0票数 1

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

packages.json

代码语言:javascript
复制
"karma-jasmine": "^0.1.5",
"karma-phantomjs-launcher": "^0.1.4",

bower.json

代码语言:javascript
复制
"elasticsearch": "~2.4.1",

我的服务

代码语言:javascript
复制
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;
      };
....

我的测试

代码语言:javascript
复制
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吗?

EN

回答 2

Stack Overflow用户

发布于 2014-09-25 10:17:19

您可以在配置时使用$provide将您的服务替换为模拟服务

代码语言:javascript
复制
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,这是不确定的。

票数 0
EN

Stack Overflow用户

发布于 2014-09-25 10:28:45

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

代码语言:javascript
复制
spyOn(esFactory.prototype, 'search')...

你就可以开始做生意了。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26028429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档