Проблема с экспортом сервера при тестировании React с Jest и Supertest - PullRequest
1 голос
/ 22 апреля 2019

Я тестирую приложение React с экспресс-бэкэндом, используя Jest и Supertest. В моем текущем тесте мне нужно заблокировать выборку, которую я делаю с Supertest. Проблема в том, что я никогда не получаю ответ от агента get () и, следовательно, никогда не получаю никаких данных.

Я думаю, что есть проблема с тем, как я экспортирую свой сервер. Я попытался изменить экспорт, от module.exports = app, до module.exports = {app}, на const server = app.listen (порт и т. Д.) И module.exports = server. Пока что ни одно из найденных мной решений не работает.

server.js:

const app = require('./app.js');
const port = process.env.PORT || 8080;
app.listen(port, () => console.log("Server running on port " + port));

app.js:

const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const app = express();
const ews = require('express-ws')(app);
const WebSocket = require('ws');
...
app.get("/menus", (req, res) => {
    const menus = MenuRepo.getMenus();
    res.json(menus)
})
...
module.exports = app;

дом-test.js

test("Test that dishes displays", async () => {

    menuRepo.populateMenus();
    overrideFetch(app);

    const driver = mount(
        <MemoryRouter>
            <ShowMenus/>
        </MemoryRouter>
    );

    const predicate = () => {
        driver.update();
        const tableSearch = driver.find('#menuTable');
        const tableIsDisplayed = (tableSearch.length >= 1);
        return tableIsDisplayed;
    };

    const displayedTable = await asyncCheckCondition(predicate, 3000, 200);
    expect(displayedTable).toBe(true);
    const menus = menuRepo.getMenus();
    const html = driver.html();

    for(let i=0; i<menus.length; i++){
        expect(html).toContain(menus[i].dishes.day);
    }
});

функция, которую я использую для извлечения:

function overrideFetch(app){

    const agent = request.agent(app);

    global.fetch = async (url, init) => {

        let response;

        if(!init || !init.method || init.method.toUpperCase() === "GET"){
            try {
                response = await agent.get(url);
            } catch (e) {
                console.log(e)
            }

        } else if(init.method.toUpperCase() === "POST"){
            response = await agent.post(url)
                .send(init.body)
                .set('Content-Type', init.headers ? init.headers['Content-Type'] : "application/json");
        } else if(init.method.toUpperCase() === "PUT"){
            response = await agent.put(url)
                .send(init.body)
                .set('Content-Type', init.headers ? init.headers['Content-Type'] : "application/json");
        } else if(init.method.toUpperCase() === "DELETE"){
            response = await agent.delete(url);
        } else {
            throw "Unhandled HTTP method: " + init.method;
        }

        const payload = response.body;

        return new Promise( (resolve, reject) => {

            const httpResponse = {
                status: response.statusCode,
                json: () => {return new Promise(
                    (res, rej) => {res(payload);}
                )}
            };

            resolve(httpResponse);
        });
    };
}

Я ожидаю, что зашнурованная выборка вернет список из семи json-меню.

...