Jasmine - 测试返回localStorage项的服务

时间:2014-10-13 15:23:03

标签: javascript angularjs unit-testing jasmine angularjs-service

我有一个身份验证服务,当用户成功登录时,该服务将当前用户对象存储在localStorage中。许多其他服务都使用此服务。服务,例如ABCService调用身份验证服务中的方法来获取通信所需的令牌。 ABCService的规范在grunt测试中失败,并说:

    TypeError: 'null' is not an object (evaluating 'ABCConfig.getUser().token')

显然,只有在用户登录时才会设置令牌。如何摆脱这种情况?或者换句话说,如何测试这个权利?

1 个答案:

答案 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提供了一个回调方法作为itbeforeEachafterEach匿名函数的参数。它看起来像这样:

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.