使用模拟工厂测试 Jasmine 中的嵌套承诺

Testing nested promise in Jasmine using mocked factory

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

这是我要测试的服务:

.factory('LoginService',['Login', function(Login){
    return {
        getActiveUser: function() {
            return Login.query({}).$promise.then(
                function (users) {
                    return users[0];
                },
                function (error) {
                    console.log(error);
                }
            );
        }
    };
}]);

这是一项简单的服务,returns 所有用户列表中的第一个用户。下面是我尝试用 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");

    });
});

我能够使用间谍并直接注入服务方法来使测试通过。现在我想实现相同的目标,但要使用模拟实例。第一个测试通过但第二个 fails.Anybody 有想法?

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

mockedService = {
    getActiveUser: function() {
        return $q.when({username: 'Thomas'});
    }
}

那你就可以偷窥了:

spyOn(mockedService, 'getActiveUser').and.callThrough();

在论文中你会 运行 它

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

您也可以手动创建类 promise API:

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