Я работаю над тестированием сервера 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"
]
}