簡體   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