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(...);