500 Внутренняя ошибка сервера в тесте Jest для приложения Express с использованием SupertestJavascript

Форум по Javascript
Ответить
Anonymous
 500 Внутренняя ошибка сервера в тесте Jest для приложения Express с использованием Supertest

Сообщение Anonymous »

Я сталкиваюсь с внутренней ошибкой сервера 500 при запуске теста Jest для моего приложения Express с помощью Supertest, но приложение работает нормально при обычном запуске (например, в браузере или Postman). Я подозреваю, что проблема связана с настройкой теста, но я не могу точно определить причину.
Это сообщение об ошибке при запуске теста npm

Код: Выделить всё

$ npm test

> kino-bio-projekt@0.0.0 test
> cross-env NODE_OPTIONS=--experimental-vm-modules jest

(node:16440) ExperimentalWarning: VM Modules is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
FAIL  tests/movies.test.js
× Home page shows list of movies and navigation links (31 ms)

● Home page shows list of movies and navigation links

expected 200 "OK", got 500 "Internal Server Error"

33 |   );
34 |
> 35 |   const response = await request(app).get('/').expect('Content-Type', /html/).expect(200);
|                                                                               ^
36 |
37 |   expect(response.text).toMatch('Pulp Fiction');
38 |   expect(response.text).toMatch('Fire Walk With Me');

at Object.expect (tests/movies.test.js:35:79)
----
at Test._assertStatus (node_modules/supertest/lib/test.js:252:14)
at node_modules/supertest/lib/test.js:308:13
at Test._assertFunction (node_modules/supertest/lib/test.js:285:13)
at Test.assert (node_modules/supertest/lib/test.js:164:23)
at Server.localAssert (node_modules/supertest/lib/test.js:120:14)
Наборы тестов: 1 неудачно, всего 1
Тесты: 1 неудачно, всего 1
Снимки: всего 0
Время: 0,617 с, расчетное 1 с
Выполнили все наборы тестов.
Я предоставлю часть своего кода
movies.test.js

Код: Выделить всё

import { expect, test } from '@jest/globals';
import request from 'supertest';
import { fetchAllMovies, fetchMovie } from '../src/js/server/fetchMovies.js';
import startApp from '../src/js/server/app.js';

test('Home page shows list of movies and navigation links', async () => {
const app = startApp(
{
fetchMovie: async () => ({
id: 1,
title: 'Pulp Fiction',
}),
fetchAllMovies: async () => [
{ id: 1, title: 'Pulp Fiction' },
{ id: 2, title: 'Fire Walk With Me' },
{ id: 3, title: 'Isle of Dogs' },
],
},
{
navLinks: async () => ({
headerData: [
{ label: 'BILJETTER', id: 'biljetter', link: '#' },
{ label: 'EVENEMANG', id: 'evenemang', link: '#' },
{ label: 'FILMER', id: 'filmer', link: 'movies' },
],
footerSection1: [
{ label: 'OM KINO', link: 'about' },
{ label: 'FRÅGOR SVAR', link: '#' },
{ label: 'KONTAKTA OSS', link: '#' },
],
}),
}
);

const response = await request(app).get('/').expect('Content-Type', /html/).expect(200);

expect(response.text).toMatch('Pulp Fiction');
expect(response.text).toMatch('Fire Walk With Me');
expect(response.text).toMatch('Isle of Dogs');

expect(response.text).toMatch('BILJETTER');
expect(response.text).toMatch('EVENEMANG');
expect(response.text).toMatch('FILMER');
});
server.js

Код: Выделить всё

import startApp from './src/js/server/app.js';
import { fetchAllMovies, fetchMovie } from './src/js/server/fetchMovies.js';
import navLinks from './src/js/server/navLinks.js';

const api = {
fetchMovie,
fetchAllMovies,
};

const nav = {
navLinks,
};

const app = startApp(api, nav);

const PORT = process.env.PORT || 5080;
app.listen(5080, () => {
console.log(`Server running on http://localhost:${PORT}`);
});
app.js

Код: Выделить всё

import express from 'express';
import ejs from 'ejs';
import { marked } from 'marked';

function startApp(api, nav) {
const app = express();

app.locals.formatMarkdown = (text) => marked(text);
app.set('view engine', 'ejs');

app.get('/', async (req, res) => {
const linkData = await nav.navLinks();
const moviesData = await api.fetchAllMovies();
res.render('pages/index', { moviesData, ...linkData });
});

app.get('/movies', async (req, res) => {
const linkData = await nav.navLinks();
const moviesData = await api.fetchAllMovies();
res.render('pages/allMovies', { moviesData, ...linkData });
});

app.get('/movie/:movieId', async (req, res) =>  {
const linkData = await nav.navLinks();
const movieData = await api.fetchMovie(req.params.movieId);
res.render('pages/movie', { movieData, ...linkData });
});

app.use('/static', express.static('./static'));

app.use((req, res) => {
const linkData = nav.navLinks();
res.status(404).render('pages/error', { message: 'Page not found', ...linkData });
});

return app;
}

export default startApp;
navLinks.js

Код: Выделить всё

const headerData = [
{
label: 'BILJETTER',
id: 'biljetter',
link: '#',
},
{
label: 'EVENEMANG',
id: 'evenemang',
link: '#',
},
{
label: 'FILMER',
id: 'filmer',
link: 'movies',
},
{
label: 'MEDLEMSKAP',
id: 'medlemskap',
link: '#',
},
{
label: 'OM OSS',
id: 'omoss',
link: 'about',
},
];

const footerSection1 = [
{ label: 'OM KINO', link: 'about' },
{ label: 'FRÅGOR SVAR', link: '#' },
{ label: 'KONTAKTA OSS', link: '#' },
];

const footerSection2 = [
{ label: 'PRESENTKORT', link: '#' },
{ label: 'TILLGÄNGLIGHET', link: '#' },
{ label: 'MEDLEMSKAP', link: '#' },
{ label: 'BISTRO-BIO', link: '#' },
{ label: 'EVENEMANG', link: '#' },
];

const footerSection3 = [
{ label: 'FACEBOOK', link: '#' },
{ label: 'INSTAGRAM', link: '#' },
];

export default function navLinks() {
return {
headerData,
footerSection1,
footerSection2,
footerSection3,
};
}
  • Запускайте приложение в обычном режиме: когда я запускаю приложение и захожу на http://localhost:5080 в браузере, оно работает нормально. Я вижу список фильмов, как и ожидалось.
  • Добавлено ведение журнала: я добавил глобальный обработчик ошибок и записал ошибку, но во время теста ошибка не записывается в консоль.
  • Имитация данных: я подтвердил, что имитируемая функция fetchAllMovies вызывается и возвращает правильные данные.
  • Упрощенный тест: я заменил тест базовым запросом к '/ 'без каких-либо ожиданий или утверждений, но Ошибка 500 сохраняется.


Подробнее здесь: https://stackoverflow.com/questions/793 ... -supertest
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»