axios mock не может обрабатывать заголовки по умолчанию при использовании jest - PullRequest
0 голосов
/ 19 февраля 2019

Я делаю тест, который включает в себя вызов axios конечным точкам.Я хочу смоделировать вызов к конечной точке и вернуть некоторые пользовательские данные, чтобы я не обращался к серверу каждый раз, когда тестирую.

Вот код действия, которое находится в его собственном действии.js файл.

login ({commit}, user)  {
  return new Promise((resolve, reject) => {
    axios.post('https://backendauth.free.beeceptor.com/api/login', user)
     .then(resp => {
       console.log('response here')
       console.log(resp)
       console.log(resp.data)
       const token = resp.data.success.token
       const user = resp.data.user
       localStorage.setItem('token', token)
       axios.defaults.headers.common["Authorization"] = "Bearer " + token;
       commit('LOGIN_SUCCESS', token, user)

При входе в систему действие вызывает конечную точку, и эта конечная точка возвращает токен, который хранится в локальном хранилище.Токен также добавляется к заголовкам по умолчанию для axios, поэтому мне не нужно подключать токен каждый раз, когда я хочу сделать вызов axios в приложении.

Теперь к тесту.Я написал тест, который успешно издевается над сообщением axios, однако завершается ошибкой при установке заголовков по умолчанию для макета.

Вот ошибка

TypeError: Cannot read property 'headers' of undefined

  37 |           const user = resp.data.user
  38 |           localStorage.setItem('token', token)
> 39 |           axios.defaults.headers.common["Authorization"] = "Bearer " + token;
     |                          ^
  40 |           commit('LOGIN_SUCCESS', token, user)
  41 |           resolve(resp)
  42 |         })

Вот тест, включающий насмешку

    import actions from "../../src/store/actions";

let url = "";
let body = "";

jest.mock("axios", () => ({
  post: (_url, _body, config) => { 
    return new Promise((resolve) => {
        resolve({'data' : {'success': {'token' : 'test'}}})
    })
  },


}))


describe('login action', () => {
    it("let the user login and access login success mutator", async() => {
        const commit = jest.fn()
        const username = 'test'
        const password = 'test'

        await actions.login({commit}, {username, password})
    })
})

Насмешка над шуткой - это полная насмешка, которая при вызове возвращает обещание сданные мне нужны, однако код не удается при попытке установить заголовки.Есть ли способ, которым я тоже могу это высмеять или мне нужно написать макет по-другому?

1 Ответ

0 голосов
/ 19 февраля 2019

Вот как вы это делаете для тех, у кого такая же проблема.Npm установите axios-mock-adapter, а затем используйте следующий код, но измените его для своих нужд.

import actions from "../../src/store/actions";
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
describe('login action', () => {
    it("let the user login and access login success mutator", async() => {


        let mockAdapter = new MockAdapter(axios);

        mockAdapter.onPost('https://hotel-dev.devtropolis.co.uk/api/apilogin').reply(200, {
              token: 'test token',
              user: {username: 'test', password: 'test'}
          });


        const commit = jest.fn()
        const username = 'test'
        const password = 'test'

        await actions.login({commit}, {username, password})

    expect(axios.defaults.headers.common.Authorization).toBe('Bearer test token')

    expect(commit).toHaveBeenCalledWith(
      "LOGIN_SUCCESS",'test token', {username, password})
    })

})
...