Typescript测试-在导入类实例之前运行代码

时间:2019-01-28 16:36:36

标签: typescript mocha chai

我正在为从TS导出的类实例编写单元测试,如下所示:

index.ts

export { myClass as MyClass } from './my-class';

my-class.ts

class MyClass {
  constructor() {
    const session = window.localstorage.getItem('some_session');
    this.restoreSession(session);
  }
  restoreSession(session) {
    this.activeSession = session;
  }
  getUserName() {
    return this.activeSession.user.name;
  }
}
export const myClass = new MyClass();

通过测试,我试图弄清楚是否可以在将MyClass导入测试之前为本地存储项提供选择的值。

我在下面尝试了以下方法,认为使用before可能对我有帮助:

我的class.spec.ts

import { MyClass } from '../src/index.ts';
import { expect } from 'chai';
import { describe, before } from 'mocha';

const persistedSession = { user: { name: 'bob' } };

before(() => {  
  window.localStorage.setItem('some_session', JSON.stringify(persistedSession));
});
describe('After loading a persisted session, and retrieving the users name', () => {
  it('should return the value of the users name', () => {
    expect(MyClass.getUserName()).to.equal('bob');
  });
});

这不会通过,因为getUserName()在测试运行时返回一个空字符串,并且我怀疑这是因为在无论如何导出类实例的情况下,在我的测试规范之前,类实例已被导入\构造。 >

我只能考虑重构我的TS,以导出该类,但不能导出一个实例,然后我将根据需要对其进行更新。

但是我想知道是否还有一种方法可以在导入班级之前设置本地存储项

1 个答案:

答案 0 :(得分:0)

正如您所提到的,在存储模拟填充之前实例化了类实例,因此也许您可以尝试以下操作

class MyClass {
  private _activeSession;

  constructor() { }

  get activeSession() {
    return this._activeSession || this._activeSession=window.localstorage.getItem('some_session');
  }

  clearActiveSession() {
    this._activeSession = undefined;
  } 

  getUserName() {
    // guard against undefined etc ...
    return this.activeSession.user.name;
  }
}  

export const myClass = new MyClass();

想法是lazy load进行会话存储,以便您可以按需模拟它们。该代码尚未经过测试,希望它能工作/提供帮助。