Передача тела запроса для публикации с использованием супер-теста - PullRequest
0 голосов
/ 29 марта 2019

Я тестирую экспресс-сервер с помощью супер-теста, и мне нужно проверить почтовый звонок. Я предполагаю, что сообщение должно быть успешным и вернуть статус 200, но оно возвращает 401. Кто-то сказал мне, что мне нужно передать тело запроса вместе с сообщением, но я точно не знаю, как это сделать.

Я пытался использовать .send ({name: 'aName'}), но это дает мне тот же код 401.

Ниже приведен app.js

require('dotenv').config();
const express = require('express');
const bodyParser = require('body-parser');
const hateoasLinker = require('express-hateoas-links');
const AValidator = require('./AValidator');
const BValidator = require('./BValidator');
const schema_v1 = require("./schema.json");
const {
    logService: logger
} = require("@utils");

let aValidator = AValidator(schema_v1);

let ValidatorApi = BValidator.ValidatorApi('api');
let adminValidator = BValidator.ValidatorAdmin('admin');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(hateoasLinker);

app.post('/*/activate',admiValidator, (req, res) => {
    console.log("In Activate===============>");
    res.status(200);
    res.json({
        rel: "self",
        method: "POST",
        title: 'Activate Solution',
        href: "/activate"
    });
});

Вот код для BValidator

ValidatorAdmin = function(callType){
    return function (req,res,next){
        let authoizationHeader = req.headers['authorization'];
        try {
        Verifier.verifyPayload(authoizationHeader, callType, (verificationError) => {
            if (verificationError) {
                res.setHeader('Content-Type', 'application/json');
                res.status(401);
                res.json({
                    message : "verificationError "+verificationError.message
                });
            } else {
                next();
            }
        });
        } catch (authorizationError) {
            res.setHeader('Content-Type', 'application/json');
            res.status(401);
            res.json({
                message : authorizationError.message
            });

        }
    }
}

Вот app.test.js

const request = require('supertest');
const bodyParser = require('body-parser');
let AValidator = require('../src/AValidator');
let BValidator = require('../src/BValidator');
BValidator = jest.fn();
AValidator = jest.fn();
app = require('../src/app');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

describe('Test os GET/POST calls in app.js', ()=>{

  test('Tests activate post', (done)=>{

    BValidator.mockReturnValue({
      ValidatorApi: (req,res,next)=>{
        next();
      },
      ValidatorAdmin:(req,res,next)=>{
        next();
      }
    });

    AValidator.mockImplementation((schema)=>{
      return function (req,res,next){
        next();
      }
    });


    request(app)
      .post('/test/activate')
      .set({name:'josh'})
      .then((response)=>{
        expect(response.statusCode).toBe(200);
        done();
      })

  })


});

So ultimately I'd like this post to resolve successfully and return a status code of 200.

1 Ответ

0 голосов
/ 30 марта 2019

Ваша проблема в том, что вы неправильно понимаете, что делают эти фиктивные функции.Прежде всего, вы полностью перезаписываете исходные значения AValidator и BValidator с помощью jest.fn().

. Таким образом, выполнение

let AValidator = require('../src/AValidator');
let BValidator = require('../src/BValidator');

в вашем тесте является избыточным.

Цель mockReturnValue состоит в том, чтобы вы могли вызвать эту функцию и вернуть указанное вами возвращаемое значение.

Получено прямо из документов Jest

const myMockFn = jest
  .fn()
  .mockReturnValue('default')
  .mockReturnValueOnce('first call')
  .mockReturnValueOnce('second call');

// 'first call', 'second call', 'default', 'default'
console.log(myMockFn(), myMockFn(), myMockFn(), myMockFn());

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

Решение заключается в предоставлении соответствующих заголовков в запросе при запуске тестов, чтобы они не давали сбоя в промежуточном программном обеспечении.Кроме того, для этого вы должны знать, что делает Verifier.verifyPayload.

с supertest ваш запрос должен выглядеть так:

request(app)
.post('/test/activate')
.set({authorization: 'a_valid_value_goes_here'})
.then((response)=>{
   expect(response.statusCode).toBe(200);
   done();
})
...