我已经编写了一个名为 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);
});
});
在此先感谢您的帮助。
答案 0 :(得分:0)
点亮
根据您的情况创建的新书有望在集成测试中使用。这就是它的工作方式,它总是在mongodb中创建一本新书。
如果您希望不更改数据库,则可以尝试进行单元测试,该单元测试应模拟数据库功能,以防止创建新书。