茉莉花间谍没有被召唤
Jasmine spy not being called
我创建了一个 angular 服务,我正在测试它没有任何问题,然后当我开始遇到问题时,我开始尝试将依赖项注入测试。
我想确保依赖项中的函数已被调用,但返回时未定义。
这是我的服务:
angular.module('enigmaApp.services', [])
.factory('auth', function($window, $http, SS){
var auth = {};
auth.register = function(user){
return $http.post('/register', user)
.success(function(data){
if(data.token){
SS.setObj('appToken', data.token);
}
});
};
return auth;
});
我的测试:
describe('Auth Service Tests', function () {
var $httpBackend, auth, defer, registerReqHandler, setObjSpy, SS, SSMock, user;
beforeEach(module('enigmaApp'));
beforeEach(function () {
// Create spies
setObjSpy = jasmine.createSpy('setObj');
SSMock = {
setObj: setObjSpy
}
SS = SSMock;
module(function ($provide) {
$provide.value('SS', SSMock);
});
});
beforeEach(inject(function (_$httpBackend_, $injector, $q) {
$httpBackend = _$httpBackend_;
defer = $q.defer();
registerReqHandler = $httpBackend.when('POST', '/register').respond(defer.promise);
auth = $injector.get('auth');
}));
afterEach(function () {
$httpBackend.flush();
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
describe('auth.register(user)', function () {
beforeEach(function () {
user = {
email: 'bwayne@wayneenterprise.com',
first_name: 'Bruce',
last_name: 'Wyane',
password: 'password123'
};
});
it('should call SS.setObj on successful registration', function () {
$httpBackend.expectPOST('/register').respond({ token: 'fakeToken' });
auth.register(user);
expect(SS.setObj).toHaveBeenCalled();
});
});
当我 运行 测试时,我得到一个失败的测试,上面写着 "Expected spy setObj to have been called." 知道我在这里做错了什么吗?我以为我为 SS.setObj 设置了一个模拟并将其提供给模块,
您遇到的一个问题是,您似乎并没有真正返回工厂中的 auth
对象:
angular.module('enigmaApp.services', [])
.factory('auth', function($window, $http, SS){
var auth = {};
auth.register = function(user){
return $http.post('/register', user)
.success(function(data){
if(data.token){
SS.setObj('appToken', data.token);
}
});
};
// need to return auth here...
return auth;
});
更新
将 flush 调用移到 it 块中
it('should call SS.setObj on successful registration', function () {
$httpBackend
.expectPOST('/register')
.respond({ token: 'fakeToken' });
auth.register(user);
$httpBackend.flush();
expect(SS.setObj).toHaveBeenCalled();
});
afterEach
块用于清理。 Jasmine 假设您的测试到那时已经结束,因此您的 flush()
调用不会有任何效果。
我创建了一个 angular 服务,我正在测试它没有任何问题,然后当我开始遇到问题时,我开始尝试将依赖项注入测试。
我想确保依赖项中的函数已被调用,但返回时未定义。
这是我的服务:
angular.module('enigmaApp.services', [])
.factory('auth', function($window, $http, SS){
var auth = {};
auth.register = function(user){
return $http.post('/register', user)
.success(function(data){
if(data.token){
SS.setObj('appToken', data.token);
}
});
};
return auth;
});
我的测试:
describe('Auth Service Tests', function () {
var $httpBackend, auth, defer, registerReqHandler, setObjSpy, SS, SSMock, user;
beforeEach(module('enigmaApp'));
beforeEach(function () {
// Create spies
setObjSpy = jasmine.createSpy('setObj');
SSMock = {
setObj: setObjSpy
}
SS = SSMock;
module(function ($provide) {
$provide.value('SS', SSMock);
});
});
beforeEach(inject(function (_$httpBackend_, $injector, $q) {
$httpBackend = _$httpBackend_;
defer = $q.defer();
registerReqHandler = $httpBackend.when('POST', '/register').respond(defer.promise);
auth = $injector.get('auth');
}));
afterEach(function () {
$httpBackend.flush();
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
describe('auth.register(user)', function () {
beforeEach(function () {
user = {
email: 'bwayne@wayneenterprise.com',
first_name: 'Bruce',
last_name: 'Wyane',
password: 'password123'
};
});
it('should call SS.setObj on successful registration', function () {
$httpBackend.expectPOST('/register').respond({ token: 'fakeToken' });
auth.register(user);
expect(SS.setObj).toHaveBeenCalled();
});
});
当我 运行 测试时,我得到一个失败的测试,上面写着 "Expected spy setObj to have been called." 知道我在这里做错了什么吗?我以为我为 SS.setObj 设置了一个模拟并将其提供给模块,
您遇到的一个问题是,您似乎并没有真正返回工厂中的 auth
对象:
angular.module('enigmaApp.services', [])
.factory('auth', function($window, $http, SS){
var auth = {};
auth.register = function(user){
return $http.post('/register', user)
.success(function(data){
if(data.token){
SS.setObj('appToken', data.token);
}
});
};
// need to return auth here...
return auth;
});
更新
将 flush 调用移到 it 块中
it('should call SS.setObj on successful registration', function () {
$httpBackend
.expectPOST('/register')
.respond({ token: 'fakeToken' });
auth.register(user);
$httpBackend.flush();
expect(SS.setObj).toHaveBeenCalled();
});
afterEach
块用于清理。 Jasmine 假设您的测试到那时已经结束,因此您的 flush()
调用不会有任何效果。