【问题标题】:Jest: async test incorrectly passes despite mismatched expect/received values开玩笑:尽管期望/接收值不匹配,但异步测试错误地通过
【发布时间】:2019-06-09 07:14:39
【问题描述】:

Jest 中的以下测试不应通过:

const targetFile = require("../targetFile.js");
fetch = jest.fn(() => Promise.resolve('file scoped default value'));

test('diffFileFetch', () => {
  fetch.mockImplementation(() => new Promise((resolve, reject) => {
    resolve('wrong value');
  }));

  targetFile.diffFileFetch()
    .then(async data => {
      await expect(data).toEqual('correct value');
    })
    .catch(e => console.log(e, `=====e=====`));
});

catch 块触发,但测试仍然通过。这是什么原因造成的,应该如何解决?

PASS  
views/admin/__tests__/CurrentCouponListingSection.test.js
  ✓ diffFileFetch (6ms)

 console.log views/admin/__tests__/testFile.test.js:59
    { Error: expect(received).toEqual(expected) // deep equality

    Expected: "correct value"
    Received: "wrong value"
        at targetFile.diffFileFetch.then (/var/www/html/wptest2/wp-content/plugins/fvc/views/admin/__tests__/testFile.test.js:58:1)
        at <anonymous>
        at process._tickCallback (internal/process/next_tick.js:188:7)
      matcherResult: 
       { actual: 'wrong value',
         expected: 'correct value',
         message: [Function],
         name: 'toEqual',
         pass: false } } '=====e====='

也试过了

从 .then() 中移除 async/await。没有区别。

【问题讨论】:

    标签: javascript jestjs


    【解决方案1】:

    测试在 Promise 回调运行之前完成,因此它通过了...然后记录错误。

    如果测试包含异步代码,那么您需要使用done

    test('diffFileFetch', done => {  // <= use done
      fetch.mockImplementation(() => new Promise((resolve, reject) => {
        resolve('wrong value');
      }));
    
      targetFile.diffFileFetch()
        .then(data => {
          expect(data).toBe('correct value');
          done();  // <= now call done
        })
    });
    

    ...返回Promise:

    test('diffFileFetch', () => {
      fetch.mockImplementation(() => new Promise((resolve, reject) => {
        resolve('wrong value');
      }));
    
      return targetFile.diffFileFetch()  // <= return the Promise
        .then(data => {
          expect(data).toBe('correct value');
        })
    });
    

    ...或使用async 测试函数和await Promise

    test('diffFileFetch', async () => {  // <= async test function
      fetch.mockImplementation(() => new Promise((resolve, reject) => {
        resolve('wrong value');
      }));
    
      const data = await targetFile.diffFileFetch()  // <= await the Promise
      expect(data).toBe('correct value');
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 2020-09-01
      • 2021-05-06
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 2023-02-08
      相关资源
      最近更新 更多