用supertest测试POST仍会创建新文档

时间:2018-07-31 15:47:16

标签: mongodb routes functional-testing hapijs supertest

我已经编写了一个名为 bookService 的服务,当前遇到的问题是,每当我使用Supertest和Expect在Hapi(v17)中测试 POST 请求时,该测试就是在数据库中创建新记录,因此实际上并没有包装我导入的应用程序。

我当前正在将 bookService 导入到 server.js 中,这是我在 server.js 中的路线的片段,如下所示:< / p>

server.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 用作supertest的“请求”库的参数,并且仍然存在此问题。我的测试通过了,但是实际上,每当我运行测试时,它实际上都会向Mongodb添加一个新的书本文档。 Supertest和Hapi有我不知道的陷阱吗?

server.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);
  });
});

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

点亮

根据您的情况创建的新书有望在集成测试中使用。这就是它的工作方式,它总是在mongodb中创建一本新书。

如果您希望不更改数据库,则可以尝试进行单元测试,该单元测试应模拟数据库功能,以防止创建新书。