Ошибка перезаписи модели: невозможно перезаписать модель `актеров` после компиляции

#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’) обещание?