使用模拟工厂测试 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'});
}
};
}
}
我正在构建 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'});
}
};
}
}