javascript 如何在循环中编写测试?

n9vozmp4  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(87)

我正在尝试编写一个动态测试,看起来像这样:

let a = []
describe(`Testing`, () => {
    before(() => {
        a = [1,2,3,4,5]
    });
    it('first', (done) => {
        expect(a[0]).to.equal(1);
    
        done();
    });
    a.forEach(value => {
        it(`should return ${ value }+1`, () => {
          expect(value).to.be.eql(value);
        })
      });

});

第一个测试运行完全正常,a数组在测试中是可访问的,但是当我尝试循环a并运行测试时,a是空的。

nbewdwxp

nbewdwxp1#

这似乎是forEach块的定时执行的问题。
它具有同步特性,因此它考虑的是在代码开始时已初始化的空数组。
jest和任何其他测试框架都具有异步特性,这意味着它是非阻塞的。
因此,代码执行将前进到下一个块,即当前具有空a[]数组引用的forEach循环。
在describe块中包含forEach循环将获得所需的结果。

describe('Testing', () => {
  let a;

  before(() => {
    a = [1, 2, 3, 4, 5];
  });

  it('first', (done) => {
    expect(a[0]).to.equal(1);
    done();
  });

  a.forEach((value) => {
    it(`should return ${value}+1`, () => {
      expect(value + 1).to.be.eql(value + 1);
    });
  });
});

编辑:要基于数组动态生成测试用例,您可以使用beforeEach钩子中的循环来单独定义测试用例。

describe('Testing', () => {
  let a;

  before(() => {
    a = [1, 2, 3, 4, 5];
  });

  it('first', (done) => {
    expect(a[0]).to.equal(1);
    done();
  });

  beforeEach(() => {
    a.forEach((value) => {
      it(`should return ${value}+1`, () => {
        expect(value + 1).to.be.eql(value + 1);
      });
    });
  });
});
  • 通过使用beforeEach而不是before,测试用例将在每个测试之前生成,确保每个测试用例的数组值都得到正确处理。

相关问题