如何在玩笑中断言函数调用顺序
How to assert function invocation order in jest
我正在用 jest.fn:
模拟两个函数
let first = jest.fn();
let second = jest.fn();
如何断言 first
在 second
之前调用?
我正在寻找的是 sinon's .calledBefore
断言。
更新
我使用了这个简单的 "temporary" 解决方法
it( 'should run all provided function in order', () => {
// we are using this as simple solution
// and asked this question here
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
包来代替您的解决方法,它通过 .toHaveBeenCalledBefore()
提供对此的支持,例如:
it('calls mock1 before mock2', () => {
const mock1 = jest.fn();
const mock2 = jest.fn();
mock1();
mock2();
mock1();
expect(mock1).toHaveBeenCalledBefore(mock2);
});
注意:根据他们的文档,您至少需要 Jest v23 才能使用此功能
https://github.com/jest-community/jest-extended#tohavebeencalledbefore
P.S。 - This feature was added a few months after you posted your question,所以希望这个答案仍然有帮助!
clemenspeters 的 solution(他想确保在登录之前调用注销)对我有用:
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)
我正在用 jest.fn:
模拟两个函数let first = jest.fn();
let second = jest.fn();
如何断言 first
在 second
之前调用?
我正在寻找的是 sinon's .calledBefore
断言。
更新 我使用了这个简单的 "temporary" 解决方法
it( 'should run all provided function in order', () => {
// we are using this as simple solution
// and asked this question here
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
包来代替您的解决方法,它通过 .toHaveBeenCalledBefore()
提供对此的支持,例如:
it('calls mock1 before mock2', () => {
const mock1 = jest.fn();
const mock2 = jest.fn();
mock1();
mock2();
mock1();
expect(mock1).toHaveBeenCalledBefore(mock2);
});
注意:根据他们的文档,您至少需要 Jest v23 才能使用此功能
https://github.com/jest-community/jest-extended#tohavebeencalledbefore
P.S。 - This feature was added a few months after you posted your question,所以希望这个答案仍然有帮助!
clemenspeters 的 solution(他想确保在登录之前调用注销)对我有用:
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)