开玩笑 - 在测试前解决承诺

jest - resolve promise before tests

我想为承诺结果编写测试,我不想在每个 it/pit 部分解决承诺。

我需要这样的东西:

describe('getData() results test', () => { 
  return getData().then(response =>  { 
    it('foo', () => expect(response.foo).toEqual(1));

    it('bar', () => expect(response.bar).toEqual(2));

    it('bar', () => expect(response.bar).toEqual(3));
  });
});

如果使用 beforeEach - promise 将被解决的次数与 it 部分的数量一样多。我需要解决一次,然后测试响应。有很多测试用例,所以我想将所有测试分成 it 个部分

查看 Jest 文档中的 Async tutorial。我相信你需要这样的东西:

describe('getData() results test', () => { 
    var response;
    beforeEach(() => {
        response = getData();
    });

    it('foo', () => { return response.then(r => expect(r.foo).toEqual(1))});

    it('bar', () => { return response.then(r => expect(r.bar).toEqual(2))});

    it('bar', () => { return response.then(r => expect(r.bar).toEqual(3))});
});

文档的关键位:

The promise that is being tested should be returned.

beforeAll 函数在 describe 中的所有规范之前仅调用一次 运行。

当return promise 时,Jest 将等待promise 解决后再让测试运行。

describe('getData() results test', () => { 
  let data = null;

  beforeAll(() => getData().then(response => {
    data = response;
  }));

  it('foo', () => expect(data.foo).toEqual(1));

  it('bar', () => expect(data.bar).toEqual(2));

  it('bar', () => expect(data.bar).toEqual(3));
});

This is not an answer to your question but it may help people comming from Google

Jest 将等待来自 beforeAllbeforeEach 的承诺 return,如 @tuchk4 所述。

就我而言,我忘记了 it 函数并将测试直接实施到 describe 中。令人惊讶的是,这个 "works" 但 beforeAllbeforeEach 的承诺将 不会 等待,这很有意义

我在报价中说 "works" 因为失败 expect() 确实会失败,但是不会等待他们 return 的承诺,这将导致 UnhandledPromiseRejectionWarning.

您可以简单地执行以下操作

describe('some test suite title', () => {
   let response;

   beforeAll(async (done) => {
    // Do some Async. logic before running any test
    await require('./somefile');
    response = await getData();
    done();
  });

    // Now run tests => response have the data
    it('foo', () => expect(response.foo).toEqual(1));

    it('bar', () => expect(response.bar).toEqual(2));

    it('bar', () => expect(response.bar).toEqual(3));
  
});