Javascript 如何在AngularJS中使用karma测试具有$q承诺的服务功能
我有一个服务,在这个服务中,我有这样的功能Javascript 如何在AngularJS中使用karma测试具有$q承诺的服务功能,javascript,angularjs,karma-jasmine,Javascript,Angularjs,Karma Jasmine,我有一个服务,在这个服务中,我有这样的功能 settings.updateProfile = function(patient){ return $q(function(resolve, reject) { var user = patient; dbService.updateUser(user).then( function (response) {
settings.updateProfile = function(patient){
return $q(function(resolve, reject) {
var user = patient;
dbService.updateUser(user).then(
function (response) {
if (response.res) {
LoopBackAuth.setUser(LoopBackAuth.accessTokenId, response.res.name, LoopBackAuth.currentUserRole);
LoopBackAuth.save();
location.reload();
patient.name == response.res.name ? resolve(true) : resolve(false);
}
},
function (error) {
resolve(false);
}
);
});
};
这里dbService.updateUser函数也包含$promise。我想测试这个函数并检查它是否解析为true或false。我知道对于http api调用,我们使用$httpBackend服务。但它并没有像我期望的那样工作。现在我正在这样测试它
it('Should return correct result', function() {
var result = true;
var patient = {"name": "newUser"};
$httpBackend.whenGET(patient).respond(200, $q.when(result));
expect(settingsFactory.updateProfile).not.toHaveBeenCalled();
expect(result).toEqual(true);
settingsFactory.updateProfile(patient)
.then(function(res) {
result = res;
});
$httpBackend.flush();
expect(settingsFactory.updateProfile).toHaveBeenCalledWith(patient);
});
它显示错误:
Error: Unexpected request
正在失败,因为patient
是一个对象{“name”:“newUser”}
并且whenGET需要一个字符串。例如:
$httpBackend.whenGET('/patient').respond(...);
如果测试不正确,则应首先设置$httpBackend,以便在请求端点时响应200。然后打电话给你的服务部,等着我给你的承诺,我没有完全理解你。你能更改我的测试并用代码显示它吗?感谢您对代码结构的评论:如果
dbService.updateUser(user)
返回一个承诺,您根本不需要使用$q
,只需返回整个dbService.updateUser(…)。然后(…)
表达式,并从处理函数内部返回true
或false
。是的,这样更好。谢谢你的建议。
$httpBackend.whenGET('/patient').respond(...);