Как макетировать вызовы API с помощью ax ios в Jest? - PullRequest
1 голос
/ 11 марта 2020

Я новичок в тестировании, и у меня есть несколько вопросов по поводу насмешливого API и экземпляра ax ios с классом ES6.

У меня есть index.js:

import axios from 'axios';

export default class Pushkin {
  constructor() {
    this.con = undefined;
  }

  connect(quizAPIUrl) {
    this.con = axios.create({
      baseURL: quizAPIUrl,
    });
  }
  
  prepExperimentRun(userID) {
    const postData = {
      user_id: userID,
    };
    return this.con.post('/startExperiment', postData);
  }
  
  // ......
}

Я попробовал несколько способов проверить это:

import axios from 'axios';
import Pushkin from '../src/index';

jest.mock('axios');

const quizURL = './api/quiz';
axios.create.mockImplementation(() => Promise.resolve(quizURL));

const pushkinClient = new Pushkin();

test('connect to quiz api url', () => {
  pushkinClient.connect(quizURL);
  // Pushkin { con: Promise { './api/quiz' } }
  pushkinClient.con.then((data) => expect(data).toEqual(quizURL));
});

test('prepExp', () => {
  const postData = { data: [{ user_id: 123456 }] };
  axios.post.mockImplementation(() => Promise.resolve(postData));
  pushkinClient.prepExperimentRun(123456).then((data) => expect(data).toBe(postData));
});

Когда я запускаю второй тест prepExp, выдается ошибка TypeError: this.con.post is not a function. И this.con - это Promise { './api/quiz' }.

Как я должен насмехаться над quizAPIurl in connect(quizAPIurl) вместо простого его кодирования? После этого, как правильно смоделировать экземпляр ax ios и проверить POST-запросы? Спасибо.

1 Ответ

1 голос
/ 11 марта 2020

Это потому, что вы не насмехались над своим методом create() правильно

axios.create.mockImplementation(() => Promise.resolve(quizURL));

Это только вернет Promise<string>, который не содержит post() метод. Поэтому, конечно, это будет «не функция».

Одним из решений является то, что вы можете смоделировать объект с помощью метода post:

axios.create.mockImplementation(() => { get: () => {...} });

Другой способ, который может быть умнее но я не проверял, просто возвращает сам Axois.

axios.create.mockImplementation(() => axios);

...

axios.post.mockImplementation(() => Promise.resolve(postData));
...