AngularJS тестирование с жасмином

Я новичок в программировании, и я пытаюсь понять, как проводить модульное тестирование кода angularJS с помощью жасмина, и это сводит меня с ума!

Это угловой код, который я пытаюсь протестировать, он все настроен в веб-приложении asp.net с использованием abpBoilerplate и angular. Результат приведенного ниже кода заключается в том, что при нажатии кнопки на веб-странице появляется всплывающее окно "Успех" и в текстовом поле появляется "true", если служба доступна. Служба извлекается из классов в рамках проекта веб-API.

(function() {
    var controllerId = 'app.views.home';
    angular.module('app').controller(controllerId, [
        '$scope', 'abp.services.lfcservice.webapi', function($scope,lfcServices) {
            var vm = this;

            //Home logic...

            vm.CheckLfcIsAvailable = function () {
                lfcServices.lfcIsAvailable()
                    .success(function () {
                        abp.notify.info('Success');
                        vm.Available = 'True';
                    });
                };

Мне просто нужно знать, как написать тест с жасмином, который проходит, когда он ожидает истинное значение для службы lfc. Я пробовал множество разных комбинаций безуспешно, я мог вставить 10 разных попыток, которые у меня были здесь, но все они очень разные.

Любая помощь приветствуется!

1 ответ

Во-первых, вам нужно знать, как тестировать контроллер, издеваясь над сервисом. Затем вам нужно смоделировать API службы, чтобы вернуть обещание.

скажем, контроллер инициируется с Available = false;,

Проверьте угловой контроллер 1.x (см. JsFiddle):

describe("app.views.home controller spec", function() {
    var ctrl;
    //depend on the module
    beforeEach(module('app'));

    beforeEach(inject(function($controller) {
        //use angular's "$controller" to get the controller
        ctrl = $controller("app.views.home");
    }));

    it("available should be false", function() {
        expect(ctrl.Available).toBe(false);
    });  
});

Теперь давайте предположим, что сервис возвращает простой результат (без обещаний) и посмотрим, как мы предоставляем фиктивный сервис вместо реального сервиса.

Проверьте угловой контроллер 1.x с помощью фиктивного сервиса (см. JsFiddle):

beforeEach(module(function($provide) {
    var mockService = jasmine.createSpyObj('mock', ['lfcIsAvailable']);
    mockService.lfcIsAvailable.and.returnValue(true);
    $provide.value('abp.services.lfcservice.webapi', mockService);
}));

Теперь давайте посмотрим, как высмеивать ответ на обещание. для этого мы будем использовать $q,

Ложное угловое обещание 1.x (см. JsFiddle):

it('should change after promise resolved', inject(function($q, $rootScope) {
    //create promise
    var deferred = $q.defer();

    //mock service response 
    mockService.lfcIsAvailable.and.returnValue(deferred.promise);

    //call CheckLfcIsAvailable ()
    ctrl.CheckLfcIsAvailable ();

    expect(ctrl.Available).toBe(false);

    deferred.resolve(true);

    //not yet...
    expect(ctrl.Available).toBeNull(false);

    //from angular $q documentation: 
    //"it's important to know that the resolution of promises is tied to the digest cycle"
    $rootScope.$apply();

    //now!
    expect(ctrl.Available).toBe(true);

}));
Другие вопросы по тегам