如何在AngularJS中测试具有$ q承诺和karma的服务函数

时间:2016-12-06 08:45:28

标签: javascript angularjs karma-jasmine

我有服务,在该服务中,我有这样的功能

 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

1 个答案:

答案 0 :(得分:1)

$httpBackend.whenGET(patient).respond(...);

失败,因为patient是一个对象{"name": "newUser"},而且当GET期待一个字符串时。例如:

$httpBackend.whenGET('/patient').respond(...);