Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用模拟工厂测试茉莉花中的嵌套承诺_Javascript_Angularjs_Mocking_Jasmine_Promise - Fatal编程技术网

Javascript 使用模拟工厂测试茉莉花中的嵌套承诺

Javascript 使用模拟工厂测试茉莉花中的嵌套承诺,javascript,angularjs,mocking,jasmine,promise,Javascript,Angularjs,Mocking,Jasmine,Promise,我正在构建AngularJS应用程序,并尝试对其进行单元测试。我想注入模拟服务,而不是真正的依赖项 这是我正在尝试测试的服务: .factory('LoginService',['Login', function(Login){ return { getActiveUser: function() { return Login.query({}).$promise.then( function (users) {

我正在构建AngularJS应用程序,并尝试对其进行单元测试。我想注入模拟服务,而不是真正的依赖项

这是我正在尝试测试的服务:

.factory('LoginService',['Login', function(Login){
    return {
        getActiveUser: function() {
            return Login.query({}).$promise.then(
                function (users) {
                    return users[0];
                },
                function (error) {
                    console.log(error);
                }
            );
        }
    };
}]);
它是一个简单的服务,从所有用户列表中返回第一个用户。下面是我用mock编写单元测试的尝试,但没有成功

....
beforeEach(module('loginModule', function($provide) {

    mockedService = {
        getActiveUser: function() {
            return {
                then: function(callback) {
                    return callback({name: 'John'});
                }
            };
        }
    };

    $provide.value('LoginService', mockedService);

}));

beforeEach(inject(function (_LoginService_,  _Login_, _$httpBackend_, $rootScope) {
    LoginService = _LoginService_;
    Login = _Login_;
    scope = $rootScope;
    httpBackend = _$httpBackend_;

    spyOn(mockedService, 'getActiveEnvironment').andCallThrough();
}));

describe('getActiveUser', function () {
    it('should call the function', function() {
        LoginService.getActiveUser();
        expect(mockedService.getActiveUser).toHaveBeenCalled();
    });

    it('should return active user', function() {
        var user = {};

        mockedService.getActiveUser().then(
            function (env) {
                user = env;
            }
        )

        expect(user.name).toBe("John");

    });
});

我能够使用间谍和直接注入服务方法通过测试。现在,我想实现同样的目标,但是使用模拟实例。第一个测试通过,但第二个测试失败。有人有这个想法吗?

尝试以这种方式模拟服务:

mockedService = {
    getActiveUser: function() {
        return $q.when({username: 'Thomas'});
    }
}
然后你可以监视它:

spyOn(mockedService, 'getActiveUser').and.callThrough();
你可以在这里运行它

mockedService.getActiveUser().then(function(env) {
    user = env;
});
您还可以手动创建promise-like API:

mockedService = {
    getActiveUser: function() {
        return {
            then: function(callback) {
                return callback({username: 'Thomas'});
            }
        };
    }
}

在这种情况下,我得到:undefine不是以下行中的函数:mockedService.getActiveUsee。然后(…)我现在编辑问题,确保调用方法:
mockedService.getActiveUser()
,注意
()
。通常,您最初的方法是不正确的:
mockedService.getActiveUser.then…
。模拟服务的API与真正的服务不对应,现在应该是这样的。你应该像在应用程序中一样调用
getActiveUser()
。我还建议你使用
q.when({username:'Thomas'})版本。请不要手动创建非承诺/a+投诉“then”方法。至少在setTimeout中包装回调调用。