2014-12-12 2 views
2

я следующий код на заводе:Как я могу проверить, что дает обещание AngularJS, используя Jasmine?

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

app.factory('apiFactory', function($http) { 
    return { 
    'call':function(){ 
     $http.get('http://www.google.com').then(function(){ 
     return 'I visited Google!'; 
     }); 
    } 
    }; 
}); 

И следующий тест Жасмин:

describe('Testing apiFactory', function() { 
    var $scope, 
    apiFactory, 
    $http, 
    $q, 
    rootScope; 

    beforeEach(module('plunker')); 

    beforeEach(inject(function($rootScope, _apiFactory_, _$http_, _$q_, _$rootScope_) { 
    apiFactory = _apiFactory_; 
    $http = _$http_; 
    $q = _$q_; 
    rootScope = _$rootScope_; 
    })); 

    it('should return "I visited Google!"', function(){ 
    var deferred = $q.defer(); 
    spyOn($http, 'get').and.returnValue(deferred.promise); 
    deferred.resolve(); 
    apiFactory.call(); 
    rootScope.$apply(); 

    expect($http.get).toHaveBeenCalledWith('http://www.google.com'); 
    }); 
}); 

Как вы можете видеть выше, я знаю, как проверить http.get обещание $ было называется, но, как я могу проверить, что функция перешла к then() метод возвращает «

Вот plunkr для этого кода» я посетил Google! ": http://plnkr.co/edit/DrKGV11eTpi2CrtYtffp

ответ

1

Вы почти здесь, вам просто нужно сделать пару вещей.

  1. В методе apiFactory.call вы должны вернуть $ http.get(). Это вернет обещание вызывающему.
  2. Вам нужно добавить какую-то проверку, чтобы убедиться, что результат был возвращен методом apiFactory.call.

Я изменил свой тест, чтобы выглядеть следующим образом:

it('should return "I visited Google!', function(){ 
    var deferred = $q.defer(); 
    var result; 

    spyOn($http, 'get').and.returnValue(deferred.promise); 
    deferred.resolve(); 

    apiFactory.call().then(function(resolved) { 
    result = resolved; 
    }); 

    expect($http.get).toHaveBeenCalledWith('http://www.google.com'); 
    expect(result).toBeUndefined(); 

    rootScope.$apply(); 

    expect(result).toBe('I visited Google!'); 
}); 

Чтобы уточнить, что ваш метод apiFactory.call должен выглядеть следующим образом:

return $http.get('http://www.google.com').then(function(){ 
    return 'I visited Google!'; 
}); 

Это должно работать для вас!

+0

Правильно, вы просто вызываете метод 'then()' по возвращенному обещанию (BTW, я забыл добавить возврат в свой пример, но у меня есть его в моем коде) и проверить параметры, с которыми он был вызван. Я должен был подумать об этом! Большое спасибо, отличный ответ! –

Смежные вопросы