茉莉花间谍没有被召唤

时间:2015-07-29 22:20:54

标签: angularjs unit-testing karma-jasmine

我创建了一个角度服务,我正在测试没有任何问题,然后我开始尝试在我遇到问题时为测试注入依赖项。

我想确保已经调用了依赖项中的函数,但它未定义。

这是我的服务:

angular.module('enigmaApp.services', [])
    .factory('auth', function($window, $http, SS){
        var auth = {};

        auth.register = function(user){
            return $http.post('/register', user)
            .success(function(data){
                if(data.token){
                    SS.setObj('appToken', data.token);
                }
            });
        };

        return auth;
    });

我的测试:

describe('Auth Service Tests', function () {
  var $httpBackend, auth, defer, registerReqHandler, setObjSpy, SS, SSMock, user;

  beforeEach(module('enigmaApp'));

  beforeEach(function () {    
    // Create spies
    setObjSpy = jasmine.createSpy('setObj');

    SSMock = {
      setObj: setObjSpy
    }

    SS = SSMock;

    module(function ($provide) {
      $provide.value('SS', SSMock);
    });
  });

  beforeEach(inject(function (_$httpBackend_, $injector, $q) {
    $httpBackend = _$httpBackend_; 
    defer = $q.defer();
    registerReqHandler = $httpBackend.when('POST', '/register').respond(defer.promise);
    auth = $injector.get('auth');
  }));

  afterEach(function () {
    $httpBackend.flush();
    $httpBackend.verifyNoOutstandingExpectation();
    $httpBackend.verifyNoOutstandingRequest();
  });

  describe('auth.register(user)', function () {
    beforeEach(function () {
      user = {
        email: 'bwayne@wayneenterprise.com',
        first_name: 'Bruce',
        last_name: 'Wyane',
        password: 'password123'
      };
    });

    it('should call SS.setObj on successful registration', function () {
      $httpBackend.expectPOST('/register').respond({ token: 'fakeToken' });
      auth.register(user);
      expect(SS.setObj).toHaveBeenCalled();
    });
  });

当我运行测试时,我得到一个失败的测试,上面写着“已经调用了预期的间谍setObj”。我在这里做错了什么?我以为我为SS.setObj设置了一个模拟器并将其提供给模块,

1 个答案:

答案 0 :(得分:0)

您遇到的一个问题是,您工厂中的auth对象实际上并未返回:

angular.module('enigmaApp.services', [])
.factory('auth', function($window, $http, SS){
    var auth = {};

    auth.register = function(user){
        return $http.post('/register', user)
        .success(function(data){
            if(data.token){
                SS.setObj('appToken', data.token);
            }
        });
    };


    // need to return auth here...
    return auth;
});

<强>更新

将您的同花顺电话移至您的阻止

it('should call SS.setObj on successful registration', function () {

  $httpBackend
    .expectPOST('/register')
    .respond({ token: 'fakeToken' });

  auth.register(user);
  $httpBackend.flush();

  expect(SS.setObj).toHaveBeenCalled();
});

afterEach块用于清理。 Jasmine认为你的测试结束了,所以你的flush()电话不会有任何影响。