¿Cómo hacer coincidir llamadas con una matriz con orden?
Por ejemplo, lo he intentado, pero fallé porque ignora el pedido:
expect(fn()).toBeCalledWith(expect.arrayContaining([1,2,3])) Mi objetivo es tener éxito cuando llamo con [1,2,3] [1,2,3,4] [1,10,2,7,8,9,3] pero no [3,2,1] El código anterior Dame pase cuando me llamen con [3,2,1] , ¿cómo puedo lograr este objetivo?
Este final se puede hacer con expect.extend , que puedo crear mi comparador personalizado. https://jestjs.io/docs/expect#expectextendmatchers
expect.extend({ arrayContainingWithOrder(received, sample) { let index = 0; for (let i = 0; i < received.length; i++) { if (received[i] === sample[index]) { index++; } } const pass = index === sample.length; if (pass) { return { message: () => `expected ${received} not to be contain ${sample} with order`, pass: true, }; } else { return { message: () => `expected ${received} to be contain ${sample} with order`, pass: false, }; } }, });Puede convertir su matriz esperada y el argumento llamado en cadenas como 1,2,3 . Y luego puede usar expect.stringContaining en lugar de expect.arrayContaining . Por ejemplo
const mockedFunction = jest.fn() expect(mockedFunction).toHaveBeenCalled() //make sure your mocked function get called const calledArray = mockedFunction.mock.calls[0][0] //get first argument which is your array const expectedArray = [1,2,3] const calledArrayString = calledArray.filter(value => expectedArray.includes(value)).join(",") //only keep contained values const expectedArrayString = expectedArray.join(",") expect(calledArrayString).toEqual(expect.stringContaining(expectedArrayString))