#node.js #express #jestjs
#node.js #выразить #jestjs
Вопрос:
Это моя модель актера.
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ActorSchema = new Schema({
name: {
type:String,
required:true,
minlength: [3, 'Actor Name must be at least 3 characters.'],
},
imdb_url:{
type:String,
required:true,
}
});
module.exports = mongoose.model('actors', ActorSchema);
Это мой тестовый файл.
const request = require('supertest')
const Actor = require('../../models/actor')
let server;
describe('/actors', () => {
beforeEach( () => { server = require('../../app'); });
afterEach( () => { server.close() });
describe('GET /', () =>{
it("should return all actors", async () => {
const res = await request(server).get('/admin/actors');
expect(1).toBe(1);
})
})
})
Итак, в тестовом файле я получил следующее: require('../../app');
который выполняет app.js
код, содержащий эту строку require("./startup/routes")(app)
, и в маршрутах мне требуются модели.
После того, как я запустил тест npm, он говорит :
Ошибка перезаписи модели: невозможно перезаписать
actors
модель после компиляции.
Как мне это решить?
Я понимаю, что требование для модели актеров выполняется дважды, но из-за кэширования модуля модуль модели актера должен выполняться только один раз, но я предполагаю, что он выполняется дважды.
Ответ №1:
Ваша модель требуется дважды, поэтому возникает ошибка.
Удалите эту строку из тестового примера.
const Actor = require(‘../../модели / актер’);
Только приложение должно вызывать модель сразу при запуске сервера.
Предположим, вы включили модель в app.js как
this.actorModel = require(‘../../модели / актер’);
Модель доступа, подобная
app.actorModel в вашем тестовом примере.
Я думаю, что всякий раз, когда вам потребуется, этот код будет выполняться:
mongoose.model(«актеры», ActorSchema);
Поэтому кэширование модуля не будет работать.
Комментарии:
1. 1) Почему кэширование модуля не работает? 2) Мне нужна эта модель в тестовом файле, чтобы я мог внести первоначальные данные в базу данных
2. Я заставил это работать. Ошибка заключалась в опечатке (../ ../ модели / Актер»). и не актер. кстати, знаете ли вы, о чем говорит эта ошибка: обычно это означает, что существуют асинхронные операции, которые не были остановлены в ваших тестах. Рассмотрите возможность запуска Jest с
--detectOpenHandles
для устранения этой проблемы.3. возвращает ли request(server).get(‘/admin/actors’) обещание?