Фабрика модульных тестов Jasmine

#angularjs #unit-testing #jasmine #karma-jasmine

#angularjs #модульное тестирование #jasmine #карма-жасмин

Вопрос:

Я новичок в тестировании Jasmine, здесь я хочу протестировать свои $ resources на фабрике, поэтому сначала у меня есть эта фабрика :

 angular.module('starter.services', [])
  .factory('API', function($rootScope, $resource) {
    var base = "http://192.168.178.40:8000/api";
    return {
      getGuestListForH: $resource(base   '/guests/:id/:wlist', {
        id: '@id',
        wlist: '@wlist'
      })
    }
  });  

и мой тест :

 beforeEach(module('starter.services'));
describe('service: API resource', function() {
  var $scope = null;
  var API = null;
  var $httpBackend = null;

  beforeEach(inject(function($rootScope, _API_, _$httpBackend_) {
    $scope = $rootScope.$new();
    API = _API_;
    $httpBackend = _$httpBackend_;
    $httpBackend.whenGET('http://192.168.178.40:8000/api/guests').respond([{
      id: 1,
      name: 'a'
    }, {
      id: 2,
      name: 'b'
    }]);
  }));
  afterEach(function() {
    $httpBackend.verifyNoOutstandingExpectation();
    $httpBackend.verifyNoOutstandingRequest();
  });
  it('expect all resource in API to br defined', function() {
    $httpBackend.expect('http://192.168.178.40:8000/api/guests');

    var dd = API.getGuestListForH.query();
    expect(dd.length).toEqual(2);

    expect(API.getGuestListForH).toHaveBeenCalled();

  });
});  

и я получил в результате :

  • Ожидается, что 0 будет равно 2
    • Ожидаемый шпион, но получил функцию, что здесь не так.Я хочу протестировать ресурс на заводе, каков наилучший способ сделать это ?!

Ответ №1:

Ваши тесты могут работать даже без $rootScope и всех других объявлений переменных, которые вы сделали.

И поскольку вы пишете тесты для метода сервиса, вместо expect того, чтобы его редактировать toHaveBeenCalled , вы должны вызвать его и ожидать, что результаты будут чем-то.

Что-то вроде этого:

 describe('Service: starter.services', function() {
    beforeEach(module('starter.services'));
    describe('service: API resource', function() {
        beforeEach(inject(function(_API_, _$httpBackend_) {
            API = _API_;
            $httpBackend = _$httpBackend_;

            $httpBackend.whenGET('http://192.168.178.40:8000/api/guests').respond([{
                id: 1,
                name: 'a'
            }, {
                id: 2,
                name: 'b'
            }]);
        }));

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

        it('expect all resource in API to br defined', function() {
            var dd = API.getGuestListForH.query();
            $httpBackend.flush();
            expect(dd.length).toEqual(2);
        });
    });
});
  

Надеюсь, это поможет.

Комментарии:

1. Большое спасибо за ответ, ваше решение работает, но если я случайно удалю параметры в ресурсе (id, wlist) в сервисном модуле, этот тест всегда будет возвращать успех, и я думаю, что цель тестирования — показать подобные ошибки. Каково ваше мнение?