Jest, TypeScript и ts-jest: SyntaxError: невозможно использовать оператор импорта вне модуля - PullRequest
1 голос
/ 27 мая 2020

Я работаю над тестированием сервера Apollo с помощью Jest и SuperTest. Сервер написан на TypeScript, поэтому я использую ts-jest. Мне нужно привязать SuperTest к определенному порту. Документы SuperTest говорят:

. Вы можете передать http.Server или функцию в request () - если сервер еще не прослушивает соединения, то он привязан к временному порту для вас, так что там нет необходимости отслеживать порты.

, поэтому я хочу передать его в своем приложении. Я настроил свой индексный файл для экспорта сервера Apollo

// index.ts
import { ApolloServer } from 'apollo-server';
...
const start = () => {
    ...
    const server = new ApolloServer(config);
    server.listen().then(({ url }) => {
        log.info(`interface server ? Running at ${url}`);
    });
    return server;
};

const app = start();

export default app;

Однако, когда я запускаю свой код

// __test__/index.ts
import { default as request } from 'supertest';
import log from '../util/log';
import app from '../index';

let postData = {
    query: `query allArticles {
                allArticles {
                    id
                }
            }`,
    operationName: 'allArticles'
};

test('basic', async () => {
    try {
        const response = await request(app)
            .post('/graphql')
            .send(postData)
            .expect(200); // status code that you expect to be returned
        log.info('response', response.statusCode);
    } catch (error) {
        log.info(`error ${error.toString()}`);
    }
});

, я получаю

 FAIL  __test__/index.test.ts
  ● Test suite failed to run

    Details:

    /Users/abc/Documents/projects/yaa-interface-new/index.js:1
    import { ApolloServer } from "apollo-server";
    ^^^^^^

    SyntaxError: Cannot use import statement outside a module

      1 | import { default as request } from 'supertest';
      2 | import log from '../util/log';
    > 3 | import app from '../index';
        | ^

Для некоторых почему шутка ищет в /index.js вместо index.ts? (Все файлы js должны попасть в /dist - см. tsconfig ниже). Согласно этот вопрос о переполнении стека , мне нужно добавить Babel в Jest. Я пытался настроить как ts-jest, так и Jest для использования Babel, но признаюсь, что не понимаю, что делаю. В любом случае получаю ту же ошибку. Любые подсказки очень ценятся!

Мой jest.config.js:

 // jest.config.js
module.exports = {
    preset: 'ts-jest/presets/js-with-babel',
    testEnvironment: 'node',
    globals: {
        'ts-jest': {
            babelConfig: true
        }
    }
};

и мой tsconfig.json:

 // tsconfig.json
{
  "compilerOptions": {
    "target": "ES6",
    "lib": [
      "esnext",
      "dom"
    ],
    "skipLibCheck": true,
    "outDir": "dist",
    "strict": false,
    "forceConsistentCasingInFileNames": true,
    "esModuleInterop": true,
    "module": "commonjs",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "sourceMap": true,
    "alwaysStrict": true
  },
  "exclude": [
    "node_modules",
    "**/*.test.ts",
    "**/*.mock.ts"
  ]
}
...