Модульное тестирование большого количества введенных сервисов с использованием Жасмин

0

Я очень новичок в тестировании UnitularJs с Jasmine. Так вы можете сказать мне, как я могу проверить ниже упомянутый контроллер и метод countyService.getAllCountiesAsync countyService.getAllCountiesAsync() используя Jasmine.Thanks заранее.

Примечание. Контроллер ниже имеет более 50 инъецируемых услуг (я показал несколько ниже). Так что я не знаю, какой метод подходит для их издевательства?

Контроллер:

(function () {
    appModule.controller('myController', [
        '$scope', '$modalInstance', 'abp.services.app.property', 'abp.services.app.county', 'abp.services.app.propertyClass', 'abp.services.app.schoolDistrict'
        function ($scope, $modalInstance, propertyService, countyService, propertyClassService, schoolDistrictService) {

   vm.getAllCounties = function () {
                countyService.getAllCountiesAsync().success(function (result) {
                    vm.counties = result.items;
                });
            };

            vm.getAllCounties();

} ]);
})();

Метод WebApi:

  public async Task<ListResultOutput<CountyListDto>> GetAllCountiesAsync()
        {
            var counties = await _countyRepository
                .GetAllListAsync();

            return new ListResultOutput<CountyListDto>(counties.OrderBy(o => o.Name).MapTo<List<CountyListDto>>());
        }
Теги:
unit-testing
jasmine

2 ответа

2

Вы должны написать тестовые примеры для службы и контроллера.

Для сервисов "Daan van Hulst" уже дал ответ, а для контроллера см. Ниже код:

describe('service tests', function () {

var $compile,$controller,myController, $rootScope, propertyService, countyService, propertyClassService, schoolDistrictService;
//All module dependencies   
beforeEach(module('your-app-name'));

//inject required services and _$controller_ to create controller
beforeEach(inject(function(_$compile_,_$controller_, _$rootScope_, _propertyService_, _countyService_, _propertyClassService_, _schoolDistrictService_) {

$compile = _$compile_;
        $rootScope = _$rootScope_;
$controller = _$controller_; // This is IMP
    countyService = _countyService_;
    // remianig services
    // Now create controller 
    myController = $controller('myController', {
                $scope : scope,
                propertyService : propertyService // all other services
    });}

it('should test something', function() {
    spyOn(countyService, 'getAllCountiesAsync').and.callFake(function () {
                var d = q.defer();
                d.resolve({ items: [{data:'somedata'}] });
                return d.promise;
            });     
    myController.getAllCounties();

    expect(myController.counties).not.toBe(null);

});

Обновить

Возможно, я допустил ошибки, но это идея:

describe('service tests', function () {

var $compile, $rootScope, scope, vm, propertyService, countyService, propertyClassService, schoolDistrictService;
  beforeEach(module('your-app-name'));
  beforeEach(inject(function(_$compile_, _$rootScope_, $controller, _propertyService_, _countyService_, _propertyClassService_, _schoolDistrictService_) {
    $compile = _$compile_;
    $rootScope = _$rootScope_;
    scope = $rootScope.$new();
    propertyService = _propertyService_;
    countyService = _countyService_;
    propertyClassService = _propertyClassService_;
    schoolDistrictService = _schoolDistrictService_;

    vm = $controller('myController', {'$scope': scope})

    spyOn(countyService, "getAllCountiesAsync").and.callFake(function() {
        var deferred = $q.defer();
        deferred.resolve({data: [{id:0}]});
        return deferred.promise;
    });
  }));

  it('can do remote call', inject(function() {

    //Arrange
    result = [{id:0}];

    // Act
    vm.getAllCounties();

    // Assert
    expect(vm.counties).toBe(result); //assert to whatever is resolved in the spyOn function

  });   

});
}
  • 0
    Не могли бы вы немного рассказать об it('should test something', function() { method? B, потому что я очень новичок в этом вопросе. Спасибо.
  • 0
    Когда мы тестируем любой контроллер, мы должны шпионить за сервисами (значит, имитировать). В этом методе я использовал метод spyOn для отслеживания функции getAllCountiesAsync в countyService. Когда вызван метод контроллера get, контроллер не будет вызывать реальный сервис, вместо этого наш шпион получит выполнение. Может быть, это поможет вам понять.
Показать ещё 4 комментария
1

Я предполагаю, что вы создаете услуги Angular для всех ваших услуг и что приложение работает. Затем вы можете ввести их в свои тесты:

describe('service tests', function () {

var $compile, $rootScope, propertyService, countyService, propertyClassService, schoolDistrictService;
  beforeEach(module('your-app-name'));
  beforeEach(inject(function(_$compile_, _$rootScope_, _propertyService_, _countyService_, _propertyClassService_, _schoolDistrictService_) {
    $compile = _$compile_;
    $rootScope = _$rootScope_;
    propertyService = _propertyService_;
    countyService = _countyService_;
    propertyClassService = _propertyClassService_;
    schoolDistrictService = _schoolDistrictService_;
  }));

  it('should test something', function() {
    expect(propertyService).toBeDefined();
    expect(countyService).toBeDefined();
    expect(propertyClassService).toBeDefined();
    expect(schoolDistrictService).toBeDefined();
  });

});

Обновить

Я случайно разместил свое решение в ответе выше, поэтому исправил его сейчас. Вы можете создать свой контроллер с $ controller и передать объект области. Вы также можете передавать любые другие зависимости. Затем создайте шпиона в службе, и как только он будет вызван, вызовите другую функцию, которая разрешает обещание с макетными данными:

describe('service tests', function () {

var $compile, $rootScope, scope, vm, propertyService, countyService, propertyClassService, schoolDistrictService;
  beforeEach(module('your-app-name'));
  beforeEach(inject(function(_$compile_, _$rootScope_, $controller, _propertyService_, _countyService_, _propertyClassService_, _schoolDistrictService_) {
    $compile = _$compile_;
    $rootScope = _$rootScope_;
    scope = $rootScope.$new();
    propertyService = _propertyService_;
    countyService = _countyService_;
    propertyClassService = _propertyClassService_;
    schoolDistrictService = _schoolDistrictService_;

    // Create the controller, and pass in the scope with possible variables that you want to mock.
    vm = $controller('myController', {'$scope': scope})

    //Create a spy on your getAllCountiesAsync function and make it return a mock promise with mock data.
    spyOn(countyService, "getAllCountiesAsync").and.callFake(function() {
        var deferred = $q.defer();
        deferred.resolve({data: [{id:0}]});
        return deferred.promise;
    });
  }));

  it('can do remote call', inject(function() {

    //Arrange
    result = [{id:0}];

    // Act
    vm.getAllCounties();

    //I think that you also have to do this, but I am not a 100% sure.
    scope.$apply();

    // Assert
    expect(vm.counties).toBe(result); //assert to whatever is resolved in the spyOn function

  });   

});
}
  • 0
    Не могли бы вы рассказать мне, как проверить этот метод vm.getAllCounties ? Благодарю.
  • 0
    Вы должны посмотреть на создание шпиона для вашего обслуживания и высмеивать ответ. Пример: stackoverflow.com/questions/23705051/… .
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню