繁体   English   中英

茉莉花间谍没有被称为

[英]Jasmine spy not being called

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

我想确保已调用依赖项中的一个函数,但该函数未定义返回。

这是我的服务:

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设置了一个模拟并将其提供给模块,

您遇到的一个问题是,看来您实际上并没有在工厂中返回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区块

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()调用不会有任何效果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM