Тестирование POST с помощью супертеста по-прежнему создает новый документ

Я написал службу под названием bookService, и в настоящее время у меня проблема: всякий раз, когда я тестирую запрос POST в Hapi (v17) с помощью Supertest и Expect, тест создает новую запись в базе данных, так что на самом деле это не обертка приложения, которое я импортировал.

В настоящее время я импортирую bookService в server.js, фрагмент моего маршрута в server.js выглядит следующим образом:

сервер.js

const Hapi = require('hapi');
const mongoose = require('mongoose');
const bookService = require('./book-service');

server.route({
  method: 'POST',
  path: '/books',
  handler: bookService.createBook
});

const init = async () => {
  await server.start();
  mongoose.connect(MongoDBUrl, { useNewUrlParser: true }).then(() => {
    console.log(`Connected to Mongo server at ${MongoDBUrl}`)
  }, err => {
    console.log(err)
  });
};

init();

module.exports = { server };

В следующем фрагменте показана функция, которую bookService выполняет для запроса POST:

bookService.js

const { Book } = require('./models/book');

const createBook = (req, h) => {
  const book = new Book({
    author: req.payload.author,
    title: req.payload.title,
    year: req.payload.year
  });

  return Book.create(book).then((book) => {
    return h.response({
      message: "Book created successfully",
      book
    }).code(200);
  }).catch((err) => {
    return {err};
  });
};

module.exports = { createBook };

Я использую server.listener в качестве аргумента для библиотеки запросов супертеста, и у меня все еще есть эта проблема. Мой тест проходит, однако он фактически добавляет новый документ книги в Mongodb всякий раз, когда я запускаю тест. Есть ли какие-то проблемы с Supertest и Hapi, о которых я не знаю?

сервер.test.js

const expect = require('expect');
const request = require('supertest');

const { server } = require('../server/server');

describe('POST /books', () => {
  it('should create a new book', (done) => {
  let book = {
    author: "Steinbeck",
    title: "Grapes of Wrath",
    year: "1939"
  };

  request(server.listener)
    .post('/books')
    .send(book)
    .expect(200)
    .expect((res) => {
      expect(res.body.book.author).toBe(book.author);
      expect(res.body.book.title).toBe(book.title);
      expect(res.body.book.year).toBe(book.year);
    })
    .end(done);
  });
});

Спасибо заранее за любую помощь.


person Street.lit    schedule 31.07.2018    source источник


Ответы (1)


горит,

Новая книга, созданная в вашем случае, ожидается в интеграционном тестировании. Вот как это работает, и он всегда создает новую книгу в вашем mongodb.

Если вы планируете не менять базу данных, возможно, вы можете попробовать модульный тест, который должен имитировать функции базы данных, чтобы предотвратить создание новой книги.

person deerawan    schedule 06.08.2018