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);
}));