我对AngularJS Service和Jasmine测试有问题。我在另一个服务中使用服务依赖,当我尝试进行单元测试时出现错误:
TypeError:undefined不是对象(评估sso.getSession()。userId')
我有一个服务sso,具有获取Session的功能。在会话中,我保存了例如userId和email。
myApp.service('sso', function($rootScope) {
var session;
function initSession(){
....
someData = .....;
session = someData;
}
function getSession() {
return session;
}
})
我使用sso服务功能的另一个服务(还有userContext - 用userContext我没有任何问题)
myApp.service('adminLogStore', function($http, userContext, sso) {
var self = this;
this.saveLog = function(log, userContext.userId) {
return .........
}
var admin = {
id: sso.getSession().userId,
email: sso.getSession().userEmail,
login: sso.getSession().username
};
.......
}
最后 - 我的单元测试:
describe('Service count ', function () {
var $t, $httpBackend, adminLogStore;
var uid = 5;
beforeEach(ModuleBuilder.forModules('myapp.common', 'testing.helpers')
.serviceWithMocksExcept('adminLogStore', '$rootScope', '$http', '$q', '$location')
.build()
);
beforeEach(inject(function (TestingService, _$httpBackend_, _adminLogStore_, userContext, sso) {
$t = TestingService;
adminLogStore = _adminLogStore_;
$httpBackend = _$httpBackend_;
userContext.userId = uid;
}));
it('good value', inject(function () {
expect(userContext.userId).toBe(5);
}));
});
我应该如何模拟sso功能?如果我在sso.getSession()之后不使用.userId,我不会收到任何错误。
我尝试在beforeEach中添加mock,就在userContext.userId下,但它不起作用:
var user = {
userId: 5,
userEmail: 'test@o2.pl',
username: 'test'
};
sso = jasmine.createSpyObj('sso', ['getSession']);
sso.getSession = function() {
return user;
};
现在我尝试模拟管理对象而不是模拟sso对象,但没有任何结果。
var user = {
id: 5,
email: 'test@o2.pl',
login: 'test'
};
beforeEach(inject(function (TestingService, _$httpBackend_, _adminLogStore_, userContext) {
$t = TestingService;
adminLogStore = _adminLogStore_;
$httpBackend = _$httpBackend_;
userContext.userId = uid;
adminLogStore.admin = user;
}
我改变了我的adminLogStore服务:
this.admin = {
// id: 12,
id: sso.getSession().userId,
email: sso.getSession().userEmail,
login: sso.getSession().username
};
但我仍然得到同样的错误。
我也尝试像这样模拟sso.getSession(),但它不起作用:
spyOn(sso, "getSession").and.returnValue(user);
答案 0 :(得分:0)
最后 - 这是我的解决方案。创建mock,并将return user添加为getSession函数:
beforeEach(inject(function (TestingService, _$httpBackend_, _adminLogStore_, userContext, _ssoMock_) {
$t = TestingService;
adminLogStore = _adminLogStore_;
$httpBackend = _$httpBackend_;
userContext.userId = uid;
ssoMock = _ssoMock_;
ssoMock.getSession.and.returnValue(user);
}
当然,必须声明var ssoMock。