单元测试session emberJS中的存储值

qoefvg9y  于 2022-09-28  发布在  其他
关注(0)|答案(1)|浏览(131)

我是新成员,试图找出如何使用sinon对sessionStorage进行单元测试,在访问该页面时基于url参数。我试了一些东西,但仍然没有得到想要的结果。即使我在未编辑查询参数的情况下更改了“sessionValue”,它也会通过。提前谢谢你。

  • ember组件*
beforeModel(transition) {

    //transition will contain an object containing a query parameter. '?userid=1234' and is set in the sessionStorage.

    if(transition.queryparam.hasOwnProperty('userid')){
        sessionStorage.setItem('user:id', transition.queryparam)
    }
}
  • Ember测试*
test('Session Storage contains query param value', async assert => {
let sessionKey = "user:id";
let sessionValue = "1234"

let store = {};
  const mockLocalStorage = {
    getItem: (key) => {
      return key in store ? store[key] : null;
    },
    setItem: (key, value) => {
      store[key] = `${value}`;
    },
    clear: () => {
      store = {};
    }
  };

  asserts.expect(1);

  let spy = sinon.spy(sessionStorage, "setItem");
  spy.calledWith(mockLocalStorage.setItem);

  let stub = sinon.stub(sessionStorage, "getItem");
  stub.calledWith(mockLocalStorage.getItem);
  stub.returns(sessionValue);

  await visit('/page?userid=1234');

  mockLocalStorage.setItem(sessionKey, sessionValue);
  assert.equal(mockLocalStorage.getItem(sessionKey), sessionValue, 'storage contains value');
})
cyej8jka

cyej8jka1#

欢迎来到Ember!
有很多方法可以测试,下面的建议是“一种方法”(我将如何处理与SessionStorage的交互)。
不是在测试中重新创建SessionStorage API,而是在Session Storage周围使用预先制作的代理,您感觉如何?(例如:“不要嘲笑你没有的东西”)
使用:https://github.com/CrowdStrike/ember-browser-services/#sessionstorage
你的应用程序代码如下:

@service('browser/session-storage') sessionStorage;

beforeModel(transition) {
  // ... details omitted ...
  // note the addition of `this` -- the apis are entirely the same
  //     as SessionStorage
  this.sessionStorage.setItem('user:id', ...)
}

然后在测试中:

module('Scenario Name', function (hooks) {
  setupApplicationTest(hooks);
  setupBrowserFakes(hooks, { sessionStorage: true });

  test('Session Storage contains query param value', async assert => {
    let sessionKey = "user:id";
    let sessionValue = "1234"

    let sessionStorage = this.owner.lookup('browser/session-storage');

    await visit('/page?userid=1234');

    assert.equal(sessionStorage.getItem(sessionKey), '1234', 'storage contains value');
  });

})

使用这种方法,甚至不需要使用sinon:)

相关问题