Testuję, z jakimi argumentami funkcja została wywołana, ale nie jest przekazywana, ponieważ kolejność właściwości wewnątrz obiektu, na przykład:

const obj = {
  name: 'Bla',
  infos: {
    info1: '1',
    info2: '2'
  }
}

expect(function).toHaveBeenCalledWith(obj)

Błąd mówi, że został nazwany w ten sposób: {name: 'bla', infos: {info2: '2', info1: '1'}}

Zmieniłem zamówienia, ale nie zadziałało.

1
Eduardo H. 24 marzec 2020, 14:49

2 odpowiedzi

Najlepsza odpowiedź
  it('does not care on properties ordering', () => {
    const a = jest.fn();
    a({ a: 1, b: 2, c: {d1: 1, d2: 2} });
    expect(a).toHaveBeenCalledWith({c: {d2: 2, d1: 1}, b: 2, a: 1});
  });

Przechodzi dla mnie z Jest 24.9.0

Pod maską obowiązuje Jest Czek „isEqual”, a nie referencyjny

Ale w ten sposób nie możemy sprawdzić równości funkcji. Również częściowe dopasowanie będzie wymagało niestandardowego dopasowania.

1
skyboyer 24 marzec 2020, 12:42

Możesz zastosować podobne podejście do tej odpowiedzi SO.

Przykład:

// Assuming some mock setup like this...
const mockFuncton = jest.fn();

const expectedObj = {
  name: 'Bla',
  infos: {
    info1: '1',
    info2: '2'
  }
}

// Perform operation(s) being tested...

// Expect the function to have been called at least once
expect(mockFuncton).toHaveBeenCalled();

// Get the 1st argument from the mock function call
const functionArg = mockFuncton.mock.calls[0][0];

// Expect that argument matches the expected object
expect(functionArg).toMatchObject(expectedObj);

// Comparison using toEqual() instead which might be a better approach for your usecase
expect(functionArg).toEqual(expectedObj);

Expect.toMatchObject () Docs

Expect.toEqual () Docs

1
segFault 24 marzec 2020, 12:41