Тестирование вложенных обещаний в Jest - PullRequest
0 голосов
/ 25 апреля 2018

У меня проблемы с тестированием следующей функции в Jest.У меня есть функция, которая может принимать массив или обещание в качестве аргумента.В любом случае, я передаю этот аргумент в вызов axios, единственное различие заключается в том, что если аргумент является обещанием, я вызываю .then(), прежде чем передать его в вызов.

Все это прекрасно работает, но яУ меня проблемы с написанием модульных тестов, чтобы подтвердить, что это работает.

sendItems.js

import axios from 'axios'

export const saveItems = () => {
  return axios({
    url: '/stuff/graphql',
    method: 'post',
    credentials: 'same-origin',
    data: {
      whatever: 'yo'
    }
  })
    .then(response => {
      return response
    })
    .catch(err => {
      return err
    })
}
export const sendItems = items => {

  if(items instanceof Promise){
    items.then(result => {
      return saveItems(result)
    })
      .catch(err => {
        return err
      })
  }
  else{
    return saveItems(items)
  }
}

export default { sendItems, saveItems }

И тест выглядит так:

/* global jest, describe, beforeAll, beforeEach, expect, test */
import axios from 'axios'
import MockAdapter from 'axios-mock-adapter'

describe('save items', () => {
  let sendItems, mock, items

  beforeAll(() => {
    sendItems = require('../services/sendItems.js').sendItems
    mock = new MockAdapter(axios)
    items = [
      {
        pid: '1',
        name: 'shoe'
      }
    ]
  })

  test('returns 200 when the call to save items is successful', async () => {
    const response = {
      status: 200,
      data: 'success'
    }
    mock.onPost('stuff/graphql').reply(200, response)
    const sendItemsResp = await sendItems(items)
    expect(sendItemsResp.data.status).toEqual(response.status)
  })

  test('correctly resolves the value of input passed to the service, if it is a Promise', async() => {
    const response = {
      status: 200,
      data: 'success'
    }

    items = Promise.resolve([{"p": 1}, {"p": 2}])

    mock.onPost('stuff/graphql').reply(200, response)

    const sendItemsResp = await sendItems(items)
    expect(sendItemsResp.response.status).toEqual(response.status)
    // expect(saveItems).toHaveBeenCalledWith([{"p": 1}, {"p": 2}])
  })
})

Предыдущий теств котором я передаю массив на sendItems проходы, но последний тест, в котором я передаю обещание на sendItems, не выполняется из-за того, что sendItemsResp не определено.Если при выполнении последнего теста я добавлю console.log(saveItems(result) в функцию sendItems, я получу ожидающее обещание, поэтому я предполагаю, что мне нужно кое-как разрешить это обещание в этом тесте.Однако я не знаю, как это сделать.Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 25 апреля 2018

Отсутствует оператор return в items.then(result => {

Также вы, вероятно, можете сделать const sendItems = items => Promise.resolve(items).then(saveItems)

.then и .catch также являются избыточными.

...