【问题标题】:Testing a simple AngularJS service using Jasmine使用 Jasmine 测试一个简单的 AngularJS 服务
【发布时间】:2013-03-13 19:52:19
【问题描述】:

我有一个简单的服务,我正在尝试对其进行单元测试。无论我尝试什么,searchService 是一个未知的提供者,或者 service 为空(奇怪的是这不会导致我的测试失败!!)。

有人知道我可能做错了什么吗??

angular.module('app').service('searchService', function( $q, _ ) { // _ is lodash

  var cache = [
    {
      id: "current",
      name: "Current",
      description: "Search current data"
    },
    {
      id: "historical",
      name: "Historical",
      description: "Search historical data"
    }
  ];

  this.getSearchOptions = function() {
    var deferred = $q.defer();
    deferred.resolve( angular.copy( cache ) );
    return( deferred.promise );
  };

  this.getSearchOptionsByID = function( id ) {
    var deferred = $q.defer();
    var searchOption = _.findWithProperty( cache, "id", id );

    if ( searchOption ) {
      deferred.resolve( angular.copy( searchOption ) );
    } else {
      deferred.reject();
    }
    return( deferred.promise );
   };
  }
);

我正在尝试创建一个加载到 searchService 中的单元测试,以便我可以检查缓存的值:

describe("Unit: Testing Services", function() {
  describe("Search Service:", function() {
    var service = null;

    beforeEach(function() {
      angular.module('app').service('_');
    });
    // I've also tried the commented out code below
    //beforeEach(inject(function(searchService) {
    //this.service = searchService;
    //}));
    //it('should contain an searchService', invoke(function(service) {

    it('should contain an searchService', function(searchService) {
      expect(searchService).not.to.equal(null);
    });

    it('should contain two search options', function(searchService) {
      expect(searchService.getSearchOptions()).to.equal(2);
    });
  });
});

【问题讨论】:

    标签: angularjs jasmine karma-runner angularjs-service


    【解决方案1】:

    以下内容应该适用于没有参数的服务,也许这可以作为一个起点:

    describe("Unit: Testing Services", function() {
        describe("Search Service:", function() {
    
            beforeEach(function() {
                angular.module('app');
            });
    
            it('should contain a searchService',
               inject(function(searchService) {
                    expect(searchService).not.to.equal(null);
            }));
    
            it('should contain two search options',
                inject(function(searchService) {
                    expect(searchService.getSearchOptions()).to.equal(2);
            }));
    
       });
    });
    

    (您也可以在这里查看:How do I test an AngularJS service with Jasmine?

    【讨论】:

    • 它让我朝着正确的方向前进。谢谢!我放弃了 angular.module('app'),只是做了 module('app')。然后将invoke改成inject(已经很晚了,猜我的手指有自己的想法)
    • 很高兴听到。作为旁注,实际上 module('app') 是 angular.mock.module('app') 的快捷方式,它允许您创建真实模块的模拟。
    猜你喜欢
    • 2012-10-12
    • 2016-10-22
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 2016-08-12
    • 2014-06-17
    相关资源
    最近更新 更多