Testing 如何在jest中断言函数调用顺序

Testing 如何在jest中断言函数调用顺序,testing,jestjs,babel-jest,Testing,Jestjs,Babel Jest,我正在用jest.fn模拟两个函数: let first = jest.fn(); let second = jest.fn(); 我如何断言第一个在第二个之前被调用 我要寻找的是类似于在断言之前调用的 更新 我使用了这个简单的“临时”解决方法 it( 'should run all provided function in order', () => { // we are using this as simple solution // and asked this que

我正在用jest.fn模拟两个函数:

let first = jest.fn();
let second = jest.fn();
我如何断言第一个在第二个之前被调用

我要寻找的是类似于在断言之前调用的

更新 我使用了这个简单的“临时”解决方法

it( 'should run all provided function in order', () => {

  // we are using this as simple solution
  // and asked this question here https://stackoverflow.com/q/46066250/2637185

  let excutionOrders = [];
  let processingFn1  = jest.fn( () => excutionOrders.push( 1 ) );
  let processingFn2  = jest.fn( () => excutionOrders.push( 2 ) );
  let processingFn3  = jest.fn( () => excutionOrders.push( 3 ) );
  let processingFn4  = jest.fn( () => excutionOrders.push( 4 ) );
  let data           = [ 1, 2, 3 ];
  processor( data, [ processingFn1, processingFn2, processingFn3, processingFn4 ] );

  expect( excutionOrders ).toEqual( [1, 2, 3, 4] );
} );

您可以安装jest community的
jest extended
软件包,该软件包通过
提供对此的支持,而不是您的解决方法。例如:

it('calls mock1 before mock2', () => {
  const mock1 = jest.fn();
  const mock2 = jest.fn();

  mock1();
  mock2();
  mock1();

  expect(mock1).toHaveBeenCalledBefore(mock2);
});
注意:根据他们的文档,您需要至少v23的Jest才能使用此功能

附言-,希望这个答案仍然有用

克莱门斯彼得斯(他想确保在登录前调用注销)的方法对我有效:

const logoutSpy = jest.spyOn(client, 'logout');
const loginSpy = jest.spyOn(client, 'login');
// Run actual function to test
await client.refreshToken();
const logoutOrder = logoutSpy.mock.invocationCallOrder[0];
const loginOrder = loginSpy.mock.invocationCallOrder[0];
expect(logoutOrder).toBeLessThan(loginOrder)