Как смоделировать jest.spyOn для конкретного вызова c ax ios - PullRequest
0 голосов
/ 15 января 2020

Как мне высмеять определенный c топор ios звонок? Представьте себе 2 вызова GET:

await axios.get('api/numbers');
await axios.get('api/letters');

Затем это происходит в тесте:

const mockGet = jest.spyOn(axios, 'get');
mockGet.mockReturnValueOnce(Promise.resolve({ data: 1 }));
mockGet.mockReturnValueOnce(Promise.resolve({ data: 'a' }));

Как создать условие для mockReturnValueOnce на основе URL-адреса, переданного в ax ios (скажем, за 'api/numbers' -> возврат Promise.resolve({ data: 1 }))

1 Ответ

1 голос
/ 16 января 2020

Пока что нет способа jestjs сделать это. Вот предложение: Параметризованные возвращаемые значения макета

Вот решения:

  1. Использование sinon.js

sinon.js поддержка макета возвращаемого значения на основе аргументов, есть метод с именем stub.withArgs(arg1[, arg2, ...]);

Используйте jest-when - A когда (fn) .calledWith (args) .thenReturn (значение) lib для jest

Если вы настаиваете при использовании jestjs, поскольку mockReturnValueOnce возвращает значения последовательно (первый вызов, второй вызов и т. д. c.). Вы можете использовать следующий способ:

index.js:

import axios from 'axios';

export async function main() {
  const numbersRes = await axios.get('api/numbers');
  const lettersRes = await axios.get('api/letters');
  return { numbersRes, lettersRes };
}

index.test.js:

import { main } from '.';
import axios from 'axios';

describe('59751925', () => {
  it('should pass', async () => {
    const mockGet = jest.spyOn(axios, 'get');
    mockGet.mockImplementation((url) => {
      switch (url) {
        case 'api/numbers':
          return Promise.resolve({ data: 1 });
        case 'api/letters':
          return Promise.resolve({ data: 'a' });
      }
    });
    const actual = await main();
    expect(actual.numbersRes).toEqual({ data: 1 });
    expect(actual.lettersRes).toEqual({ data: 'a' });
  });
});

Результаты модульного теста:

 PASS  src/stackoverflow/59751925/index.test.js (11.168s)
  59751925
    ✓ should pass (9ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        13.098s
...