Angular Service测试在Jasmine中使用$ http模拟失败

时间:2014-02-07 18:19:08

标签: angularjs jasmine karma-runner

我正在尝试测试一个封装我的API调用的Angular服务。为了测试我正在使用JasmineKarma。我的测试看起来像这样:

describe('$http basic', function () {

  var ConcernService, $httpBackend, $scope;

  beforeEach(module('concernsApp'));

  beforeEach(inject(function ($injector) {
    ConcernService = $injector.get('ConcernService');
    $httpBackend = $injector.get('$httpBackend');
    $scope =  $injector.get('$rootScope').$new();

    var projects = [{"id": 2, "title": "FooProject", "created_by": 1}, {"id": 5, "title": "BarProject", "created_by": 1}];

    $httpBackend.whenGET('http://localhost:8000/api/projects')
      .respond(projects);
 }));

 it('should return all projects', function () {

     ConcernService.list('projects')
        .then(function(data) {
          expect(data.length).toEqual(2);
     });

   $scope.$apply();
   $httpBackend.flush();

 });

这失败了,给我一个ConcernService是未定义的错误。

我尝试将Concernservice模块直接注入测试:

...

it('should return all projects', function () {

  inject(function(ConcernService) {

    ConcernService.list('projects')
      .then(function(data) {
        expect(data.length).toEqual(2);
    });

    $scope.$apply();
    $httpBackend.flush();

  });
});

但是现在我得到一个modulerr,大概来自未知的'ConcernService`模块。

我在这里做错了什么?

修改

var concernsApp = angular.module('concernsApp', [...]);

concernsApp.factory('ConcernService', function ($http, $q, $rootScope, dateFilter, globals) {
    ...
    var ConcernService = {
        list: function (items_url) {
            var defer = $q.defer();
            $http({method: 'GET', 
                url: api_url + items_url}).
                success(function (data, status, headers, config) {
                    defer.resolve(data);
                }).error(function (data, status, headers, config) {
                    defer.reject(status);
                });
              return defer.promise;
        },
        ...
    };
    return ConcernService;
});

2 个答案:

答案 0 :(得分:1)

好的,所以在离开它并回来之后我终于找到了问题的根源;)

解决方案是双重的。我决定更换Karma运行的浏览器(我在Debian上,最简单的浏览器是FF)。我改为Chrome,突然间我得到了更好的错误消息。在FF仅表明ConcernServiceundefined的情况下,Chrome通知我我缺少某些依赖项(本地js文件)。一旦我纠正了这些,我的所有测试都通过了!!!

谢谢所有花时间帮助我的人。我发布这个答案只是希望它可能对别人有用。

答案 1 :(得分:0)

我们用这种方式进行测试,试试看:

beforeEach(module('concernsApp'));

beforeEach(inject(function (ConcernService) {
...
}));