【发布时间】:2017-08-02 23:56:27
【问题描述】:
我正在尝试使用 Karma 和 Jasmine 对 Angular 服务进行单元测试。我正在制作我已经看过许多关于如何对来自控制器的服务调用进行单元测试的教程,但我希望在服务本身内进行单元测试。 UsersService.findById() 进行异步调用以在 ID 中查找 ID,但我不知道如何编写通过测试。我很接近,但我需要一点帮助。这是 UsersService 中的函数
users.service.js
Users.findById = function(id){
var deferred = $q.defer();
deferred.resolve(userList.find(function(user){
return user.id == id;
}));
return deferred.promise;
};
这是规格:
users.service.spec.js
describe("Users Factory", function(){
var UsersService, $q, $rootScope, $provide, deferred, mockedDeferred;
var userList = [
{ id: 1, name: "Richard Hendricks", email: "richard@piedpiper.com", phone: 4085550011, pokemon: { isPresent: true, name: "eevee"}, icon: { isPresent: false, name: null} },
{ id: 2, name: "Erlich Bachman", email: "erlich@aviato.com", phone: 4155552233, pokemon: { isPresent: true, name: "celebi"}, icon: { isPresent: false, name: null} },
{ id: 3, name: "Gavin Belson", email: "gavin@hooli.com", phone: 9165554455, pokemon: { isPresent: true, name: "snorlax"}, icon: { isPresent: false, name: null} }
];
var singleUser = { id: 2, name: "Erlich Bachman", email: "erlich@aviato.com", phone: 4155552233, pokemon: { isPresent: true, name: "celebi"}, icon: { isPresent: false, name: null} };
function mockQ(){
deferred = $q.defer();
spyOn(UsersService, "findById");
return deferred;
}
beforeEach(angular.mock.module("testing_app"));
beforeEach(angular.mock.module(function(_$provide_){
$provide = _$provide_;
}));
beforeEach(inject(function(_UsersService_, _$q_, _$rootScope_){
UsersService = _UsersService_;
$q = _$q_;
$rootScope = _$rootScope_;
}));
describe("Users.findById()", function(){
beforeEach(function(){
mockedDeferred = mockQ();
});
it("should exist", function(){
expect(UsersService.findById).toBeDefined();
});
it("should equal singleUser", function(){
UsersService.findById(2);
deferred.resolve(userList.find(function(user){
return user.id == 2;
}));
expect(UsersService.findById).toHaveBeenCalled();
expect(deferred.promise).toEqual(singleUser);
});
});
});
这是我在控制台中的内容:
我很接近,但我如何获得等于 singleUser 变量的承诺?
【问题讨论】:
-
是的,你很接近。使用 github.com/bvaughn/jasmine-promise-matchers 。否则你将不得不在里面放置期望。
标签: javascript angularjs unit-testing jasmine karma-jasmine