我有一个身份验证服务,当用户成功登录时,该服务将当前用户对象存储在localStorage中。许多其他服务都使用此服务。服务,例如ABCService调用身份验证服务中的方法来获取通信所需的令牌。 ABCService的规范在grunt测试中失败,并说:
TypeError: 'null' is not an object (evaluating 'ABCConfig.getUser().token')
显然,只有在用户登录时才会设置令牌。如何摆脱这种情况?或者换句话说,如何测试这个权利?
答案 0 :(得分:-1)
要解决您的问题,您可以使用虚假的本地存储条目模拟登录状态:
describe("when user is logged in", function () {
beforeEach(function () {
// ensure a user is logged in
localStorage.setItem('loggedIn', 'testUser');
});
it("should work", function () {
// run function, it should work
});
});
如果localStorage
中没有用户数据,它还可以测试服务的行为方式:
describe("when user is logged out", function () {
beforeEach(function () {
localStorage.removeItem('loggedIn');
});
it("should fail", function () {
// something along the lines of
// expect(ABCConfig.getUser().token).toBeNull();
});
});
关于异步调用的问题,2.0.0 +中的Jasmine提供了一个回调方法作为it
,beforeEach
和afterEach
匿名函数的参数。它看起来像这样:
describe("when user is logged in", function () {
beforeEach(function (done) {
// ensure a user is logged in
logInFunction(done); // pass done as a callback
});
it("should work", function () {
// run function, it should work
});
});
这样,只有在done
块中调用beforeEach
回调后,测试才会继续。
更多信息here.