Тестирование HTTP-запроса Request с mocha с помощью nock - PullRequest
0 голосов
/ 05 февраля 2019

Я учусь тестировать веб-приложение внешнего интерфейса без какого-либо подключения к API.Моя проблема: я должен проверить HTTP-запрос POST, но всегда получаю сообщение об ошибке: TypeError: loginUser (...). Тогда это не функция.

Я знаю, что мои ожидания не верны.Я должен изменить данные для токена JWT, а также пока не знаю, как это сделать.

Это простая аутентификация пользователя.Http пост, отправка электронной почты и пароль, возвращая JWT (JSON веб-токен).Я должен написать тест, чтобы убедиться, что я отправил правильную информацию и получил JWT в качестве ответа.

Спасибо за вашу помощь

Вот мой код:

//login.test.js

const expect = require('chai').expect;
const loginUser = require('../src/actions/authActions').loginUser;
const res = require('./response/loginResponse');
const nock = require('nock');
const userData = {
   email: 'test@test.com',
   password: '123456'
};

describe('Post loginUser', () => {
beforeEach(() => {
  nock('http://localhost:3000')
    .post('/api/users/login', userData )
    .reply(200, res);
});

it('Post email/pwd to get a token', () => {
    return loginUser(userData)
      .then(res => {
        //expect an object back
        expect(typeof res).to.equal('object');

        //Test result of name, company and location for the response
        expect(res.email).to.equal('test@test.com')
        expect(res.name).to.equal('Tralala!!!')
      });
  });
});


//authActions.js
import axios from "axios";
import setAuthToken from "../utils/setAuthToken";
import jwt_decode from "jwt-decode";
import {
  GET_ERRORS,
  SET_CURRENT_USER,
  USER_LOADING
} from "./types";

// Login - get user token
export const loginUser = userData => dispatch => {
axios
  .post("/api/users/login", userData)
  .then(res => {
    // Save to localStorage
    // Set token to localStorage
    const { token } = res.data;
    localStorage.setItem("jwtToken", token);
    // Set token to Auth header
    setAuthToken(token);
    // Decode token to get user data
    const decoded = jwt_decode(token);
    // Set current user
    dispatch(setCurrentUser(decoded));
  })
  .catch(err =>
    dispatch({
      type: GET_ERRORS,
      payload: err.response.data
    })
  );


// loginResponse.js
module.exports = { email: 'test@test.com',
password: '123456',
name: "Tralala!!!"
};

Фактический результат: 1) Опубликовать loginUser Опубликовать email / pwd для получения токена: TypeError: loginUser (...). Тогда это не функция в Context.then (test / login.test.js: 37: 12)

1 Ответ

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

То, как вы называли loginUser метод, неверно.Этот метод возвращает другую функцию.Таким образом, вместо loginUser(userData) необходимо также указать параметр dispatch, например loginUser(userData)(dispatch).then().

Я изменил метод, чтобы указать return перед axios оператором

export const loginUser = userData => dispatch => {
  return axios // adding return
    .post("/api/users/login", userData)
    .then(res => {
     ...
    })
    .catch(err =>
      dispatch({
        type: GET_ERRORS,
        payload: err.response.data
      })
    );
};

для теста, я могу задействовать Sinon для шпионажа dispatch

it("Post email/pwd to get a token", () => {
  const dispatchSpy = sinon.spy();

  return loginUser(userData)(dispatchSpy).then(res => {
    //expect an object back
    expect(typeof res).to.equal("object");

    //Test result of name, company and location for the response
    expect(res.email).to.equal("test@test.com");
    expect(res.name).to.equal("Tralala!!!");
  });
});

Надеюсь, это поможет

...