首页 > 解决方案 > 用 supertest 测试 POST 仍然会创建新文档

问题描述

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

我目前正在将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 };

以下片段显示了bookServicePOST请求创建的函数:

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

预先感谢您的任何帮助。

标签: mongodbroutesfunctional-testinghapijssupertest

解决方案


点亮,

在集成测试中需要一本在您的案例中创建的新书。这就是它的工作原理,它总是在你的 mongodb 中创建一本新书。

如果您希望不更改数据库,也许您可​​以尝试模拟数据库功能的单元测试,这样它就可以防止创建新书。


推荐阅读