【问题标题】:How to reset global variables before each test? [duplicate]如何在每次测试之前重置全局变量? [复制]
【发布时间】:2021-01-07 07:32:13
【问题描述】:

假设我有一个函数,它返回一个每次递增的 id(整数)。

let nextId = 0;

const getId = () => nextId++;

export default  getId;

我将对此功能进行多次测试。通常,在每个测试中,我希望 id 被重置,这意味着我在每个测试中第一次调用该函数时,返回的值应该是 0,但事实并非如此。该值是持久的交叉测试。

import getId  from './getId'

describe('getId()', () => {
  it('test1', () => {
    expect(getId()).toEqual(0); //passes
    expect(getId()).toEqual(1); //passes
  })
  it('test2', () => {
    expect(getId()).toEqual(0); //fails
  })
})

如何解决这个问题?有一个全局变量nextId 是个坏主意吗?

【问题讨论】:

标签: javascript jestjs


【解决方案1】:

我认为这应该可以完成这项工作。

let nextId = 0;

const getId = () => nextId++;

export default getId;
import getId from './getId'

describe('getId()', () => {
  beforeEach(() => jest.resetModules());
  it('test1', () => {
    expect(getId()).toEqual(0); //passes
    expect(getId()).toEqual(1); //passes
  })
  it('test2', () => {
    expect(getId()).toEqual(0); //fails
  })
})

有任何问题,请告诉我

【讨论】:

    【解决方案2】:

    是的,为此使用全局变量是个坏主意。全局变量更难控制,因为任何东西都可以改变它们。我只会使用一个简单的类。

    class IdManager() {
        constructor() {
            this.last_id = 0;
        }
    
        getId() {
            this.last_id++;
            return this.last_id;
        }
    
    }
    

    然后在每次开始新测试时创建一个新的 ID 管理器。

    let id_man = new IdManager();
    let id = id_man.getId();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 2018-07-21
      • 2010-12-03
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多