У меня есть издеваемое обслуживание, personService ниже, который вызывается контроллером personController, который является тем, что я тестирую.
Я хочу проверить пути прохождения/отказа, очевидно, поэтому я пытаюсь условно направить обещание на разрешение/отклонение на основе ввода в моем тесте, чтобы проверить оба пути.
// Mocking personService and its functions
beforeEach(inject(function($q) {
personService = {
addPerson: function (resolve) {
var deferred = $q.defer();
if(resolve) {
deferred.resolve();
}
else {
deferred.reject();
}
return deferred.promise;
}
};
// And add its spies
spyOn(personService, 'addPerson').and.callThrough();
}));
// Mocking $state
beforeEach(inject(function() {
$state = {
go: function() {
return true;
}
};
// And its spies
spyOn($state, 'go').and.callThrough();
}));
Для этой конкретной функции $ state.go вызывается, если вызов службы к addPerson разрешен, и не вызывается, если он отклонил, так что я лежу мое испытание, как показано ниже:
it("on return error from personService.add, state.go not called", function() {
$scope.addPerson(false);
$rootScope.$digest();
expect($state.go).not.toHaveBeenCalled();
});
it("on return success from personService.add, state.go called", function() {
$scope.addPerson(true);
$rootScope.$digest();
expect($state.go).toHaveBeenCalled();
});
В первом тесте я пропускаю ложь, которая должна отклонить обещание, а не называть $ state.go ... однако, когда тест на самом деле запущен, шпион вызывается на $ state.go!
Для справки, функция регулятора в вопросе ниже:
var _addPerson = function() {
personService.addPerson().then(function (response) {
$state.go('home.person', { personIndex: $scope.personList.length }, { reload: true });
_gotoLastPerson();
}),
function (err) {
console.log(err);
};
};
Озадачивающий примечание, которое указывает на то, что я близко ... если я удалить, если/то из addPerson и всегда только deferred.reject (), то первое испытание проходит, а второе терпит неудачу; точное обратное происходит, если я всегда откладываю.resolve().
1) Как использовать условный $ д решительность/отклонить в Jasmine издевались, позвоните в службу
Update
После поиска вокруг него, кажется, некоторые люди ставят все эти настройки в ней() блокирует себя, и в этом случае я мог бы просто изменить службу, чтобы явно разрешить или отклонить, в зависимости от того, в чём она() находится ... но это похоже на ужасные методы кодирования.