我正在尝试用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请求。
答案 0 :(得分:0)
我的问题是没有意识到我使用缓存会给每个测试带来不同的结果。具体来说,如果已经为该响应保留了缓存,则我的服务逻辑阻止了对api的第二次POST。