【问题标题】:Jasmine - Test a service that returns a localStorage itemJasmine - 测试返回 localStorage 项目的服务
【发布时间】:2014-12-08 05:20:03
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以测试两种情况——一种是用户登录时,在测试前模拟登录,另一种是用户注销时,删除任何本地存储信息。
  • 抱歉,我是使用 Angular 进行 Jasmine 测试的新手,我正在努力解决它!所以模拟登录对我来说是陌生的!
  • 基本上你可以做的是使用beforeEach函数设置一个假的localStorage条目。
  • 怎么做?可以举个例子吗?

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


【解决方案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();
    });
});

关于异步调用的问题,Jasmine 在 2.0.0+ 中提供了一个回调方法作为 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
    });
});

这样,只有在 beforeEach 块中调用了 done 回调后,测试才会继续。

更多信息here.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-17
    • 2014-05-19
    • 2016-10-25
    • 2012-06-27
    • 1970-01-01
    • 2014-07-05
    • 2021-04-28
    • 1970-01-01
    相关资源
    最近更新 更多