在Karma中测试角度服务:相同的测试,不同的结果

时间:2016-08-08 21:53:33

标签: angularjs unit-testing karma-jasmine

我正在尝试用Karma测试一个Angular服务,并且得到了一些奇怪的结果,所以只是为了踢,我做了两个相同的测试,看看我是否会得到相同的结果,但我没有:< / p>

#lightbox

第一个测试通过,但第二个测试表明profileData未定义。它们是相同的测试。我假设每个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."); })); }); }); 正在重新初始化ProfileDataService,但情况可能并非如此。如果不是这样,我如何创建单独的测试,以便为每个测试用例销毁和重新初始化我的服务?

服务的逻辑非常简单:

it

我还应该注意到,我尝试在测试中的不同位置添加(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; } } })(); ,但这似乎没有任何区别。我认为手动触发摘要周期将确保捕获http帖子并嘲笑响应。

编辑:我遗漏了一个巨大的细节...... rootScope.$digest()。我忘了提到我正在使用缓存插件。这就是我的问题的原因。在创建了一个plunker并且看到我在相同的测试中得到了一致的结果后,我知道有些东西我没有意识到。由于我的缓存逻辑,第二个测试没有发出POST请求。

1 个答案:

答案 0 :(得分:0)

我的问题是没有意识到我使用缓存会给每个测试带来不同的结果。具体来说,如果已经为该响应保留了缓存,则我的服务逻辑阻止了对api的第二次POST。