Как протестировать аксиомы реакции-саги

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

Тайм-аут - обратный вызов Async не вызывается в течение таймаута, указанного jasmine.DEFAULT_TIMEOUT_INTERVAL

Все ответы на эту ошибку связаны с извлечением, как это сделать с помощью axios

./сага

const encoder = credentials => Object.keys(credentials).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(credentials[key])}`).join('&')

const postLogin = credentials => {
  credentials.grant_type = 'password'
  const payload = {
    method: 'post',
    headers: config.LOGIN_HEADERS,
    data: encoder(credentials),
    url: `${config.IDENTITY_URL}/Token`
  }
  return axios(payload)
}

function * loginRequest (action) {
  try {
    const res = yield call(postLogin, action.credentials)
    utils.storeSessionData(res.data)
    yield put({ type: types.LOGIN_SUCCESS, data: res.data })
  } catch (err) {
    yield put({ type: types.LOGIN_FAILURE, err })
  }
}

function * loginSaga () {
  yield takeLatest(types.LOGIN_REQUEST, loginRequest)
}

export default loginSaga

./Войти тест

const loginReply = {
  isAuthenticating: false,
  isAuthenticated: true,
  email: '[email protected]',
  token: 'access-token',
  userId: '1234F56',
  name: 'Jane Doe',
  title: 'Tester',
  phoneNumber: '123-456-7890',
  picture: 'pic-url',
  marketIds: [1, 2, 3]
}

describe('login-saga', () => {
  it('login identity user', async (done) => {
    // Setup Nock
    nock(config.IDENTITY_URL)
      .post('/Token', { userName: '[email protected]', password: 'xxxxx' })
      .reply(200, loginReply)

    // Start up the saga tester
    const sagaTester = new SagaTester({})

    sagaTester.start(loginSaga)

    // Dispatch the event to start the saga
    sagaTester.dispatch({type: types.LOGIN_REQUEST})

    // Hook into the success action
    await sagaTester.waitFor(types.LOGIN_SUCCESS)

    // Check the resulting action
    expect(sagaTester.getLatestCalledAction()).to.deep.equal({
      type: types.LOGIN_SUCCESS,
      payload: loginReply
    })
  })
})

Ответ 1

Вы получили следующую ошибку: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL, потому что вы не вызывали обратный вызов done в своем тесте.

Ответ 2

Поскольку у вас указано тело ({ userName: '[email protected]', password: 'xxxxx' }) в вашем nock насмешливом, он не будет отвечать loginReply до тех пор, пока он получает почтовый запрос как с заданным URL, так и с телом. Но вы не отправляете credentials с вашим действием LOGIN_REQUEST, и, следовательно, тело запроса axios (payload.data) всегда будет пустым. Вот почему ваш nock mocking не отвечает в течение указанного тайм-аута async и jest дает эту ошибку таймаута.

Чтобы исправить это, вам нужно либо удалить указанный объект в nock настройке, либо отправить LOGIN_REQUEST действие с учетными данными и изменить указанный орган для соответствия закодированным учетным данным, установленным на payload.