2016-08-08 3 views
0

Я пытаюсь проверить угловое обслуживание с кармой и получаю какие-то странные результаты, поэтому просто для ударов я сделал два теста, которые были идентичны, чтобы увидеть, получу ли я одни и те же результаты, но я не сделал:Тестирование углового обслуживания в карме: тот же тест, разные результаты

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 из-за моей логики кэширования.

+1

Как определяется услуга? –

+1

'$ httpBackend.flush()' запускает дайджест, '$ digest()' избыточен. Да, для двух идентичных спецификаций результаты должны быть одинаковыми. Тесты являются синхронными и не содержат ничего, что могло бы пропустить состояние между спецификациями, поэтому причина проблемы неизвестна. Помогло бы плунжер/скрипка, которая реплицирует проблему. – estus

ответ

0

Моя проблема не понимала, что мое использование кеша давало мне разные результаты для каждого теста. В частности, моя логика обслуживания предотвратила второй POST для api, если кэш уже был сохранен для этого ответа.