Я пытаюсь проверить угловое обслуживание с кармой и получаю какие-то странные результаты, поэтому просто для ударов я сделал два теста, которые были идентичны, чтобы увидеть, получу ли я одни и те же результаты, но я не сделал:Тестирование углового обслуживания в карме: тот же тест, разные результаты
describe('Profile Data Service', function() {
var LoginData, rootScope, $httpBackend;
beforeEach(module('myApp'));
describe('get profile data', function() {
beforeEach(inject(function(_LoginData_, $rootScope, _$httpBackend_) {
LoginData = _LoginData_;
LoginData.username= "jsmith";
LoginData.token = "token";
rootScope = $rootScope;
$httpBackend = _$httpBackend_;
}));
it('should get profile data on instantiation', inject(function(ProfileDataService) {
$httpBackend.expect('POST', 'http://mytestserver.com/api/', {
params: [{
username: "jsmith",
token: "token",
method: "getProfile"
}]
})
.respond({
result: {
address: "111 Main St."
city: "Los Angeles",
state: "CA"
}
});
$httpBackend.flush();
expect(ProfileDataService.profileData.address).toMatch("111 Main St.");
}));
it('should get profile data on instantiation', inject(function(ProfileDataService) {
$httpBackend.expect('POST', 'http://mytestserver.com/api/', {
params: [{
username: "jsmith",
token: "token",
method: "getProfile"
}]
})
.respond({
result: {
address: "111 Main St."
city: "Los Angeles",
state: "CA"
}
});
$httpBackend.flush();
expect(ProfileDataService.profileData.address).toMatch("111 Main St.");
}));
});
});
Первый тест проходит, но второй тест утверждает, что profileData не определено. Они идентичны. Я предполагаю, что для каждого it
повторная инициализация ProfileDataService, но это может быть не так. Если это не так, как мне создать отдельные тесты, чтобы моя служба была уничтожена и повторно инициализирована для каждого тестового примера?
Логика сервиса достаточно проста:
(function() {
'use strict';
angular.module('servicesModule')
.service('ProfileDataService', ProfileDataService);
ProfileDataService.$inject = ["$http", "$q", "LoginData", "CacheFactory"];
function ProfileDataService($http, $q, LoginData, CacheFactory) {
var ProfileDataService = this;
(function() {
init();
})();
function init() {
getProfile().then(function(profileData) {
ProileDataService.profileData = profileData;
});
}
function getProfile() {
var deferred = $q.defer();
var data = {
params: [{
username: LoginData.username,
token: LoginData.token,
method: "getProfile"
}]
};
var profileDataCache = CacheFactory.get('profileDataCache');
if (profileDataCache.get('profileData') && !invalidateCache) {
deferred.resolve(profileDataCache.get('profileData'));
}
else {
$http.post('http://mytestserver.com/api/', data)
.success(function(data) {
profileDataCache.put('profileData', response.result);
deferred.resolve(data.result);
});
}
return deferred.promise;
}
}
})();
Я хотел бы также отметить, что я пытался добавить rootScope.$digest()
в разных местах в тесте, но это, кажется, не имеет никакого значения. Я думал, что запуск цикла дайджеста вручную приведет к тому, что сообщение http будет поймано и ответ будет посмеяться.
Редактировать: Я ушел из огромной детали ... angular-cache
. Я забыл упомянуть, что я использую плагин для кэширования. Это и стало причиной моей проблемы. Создав плункер и увидев, что я получаю согласованные результаты для идентичных тестов, я знал, что я чего-то не понял. Второй тест не выполнял запрос POST из-за моей логики кэширования.
Как определяется услуга? –
'$ httpBackend.flush()' запускает дайджест, '$ digest()' избыточен. Да, для двух идентичных спецификаций результаты должны быть одинаковыми. Тесты являются синхронными и не содержат ничего, что могло бы пропустить состояние между спецификациями, поэтому причина проблемы неизвестна. Помогло бы плунжер/скрипка, которая реплицирует проблему. – estus