是否有可能在我的Jesttesting套件中创build一个Express.js服务器?

我试图testing一个函数,使用axios从外部API获取数据。 为了让我的testing函数尽可能地接近真实的东西,我正在查询文件中的模拟数据。 Axios无法从本地文件返回数据,这是一项安全function。 所以我正在尝试的解决scheme是在我的testing套件中启动一个简单的服务器,在那里提供文件,然后运行我的testing。

我的testing套件现在看起来像这样:

import React from 'react'; import {shallow} from 'enzyme'; import express from 'express'; import { getFeedId, getFeedData, reverseStop } from '../mocks/apiMock'; const app = express(); const port = 4000; app.use(express.static('../mocks/MockData.json')); app.listen(port, tests()); function tests () { it('returns the expected feed id for a given subway line', () => { expect(getFeedId('L')).toBe(2); }); it('returns json data', () => { expect.assertions(2); return getFeedData('L').then(data => { expect(data).toBeDefined(); expect(data.header.gtfs_realtime_version).toBe('1.0'); }); }); it('returns a stop_id for a given subway line and stop', () => { expect(reverseStop('L', 'Lorimer St')).toBe('L10N'); }); } 

我testing的function看起来像这样(使用Axios的是getFeedData,所以我不认为其他人造成的问题,但我不积极)。

 const axios = require('axios'); export function getFeedId (sub) { switch (sub) { case '1': case '2': case '3': case '4': case '5': case '6': case 'S': return 1; case 'A': case 'C': case 'E': return 26; case 'N': case 'Q': case 'R': case 'W': return 16; case 'B': case 'D': case 'F': case 'M': return 21; case 'L': return 2; case 'G': return 31; } } export function getFeedData (sub) { if (getFeedId(sub) === 2) { return axios.get('http://localhost:4000').then((data) => JSON.parse(data)); } } export function reverseStop (sub, stop) { const stops = require('../utils/stops'); const stopObjs = stops.filter((item) => item.stop_name == stop && typeof item.stop_id === 'string' && item.stop_id.charAt(0) == sub); for (var i = 0; i < stopObjs.length; i++) { if (stopObjs[i].stop_id.charAt(stopObjs[i].stop_id.length - 1) == 'N') { return stopObjs[i].stop_id; } } } 

这是Jest给我的错误信息:

 FAIL src/tests/api.test.js (23.311s) ● returns json data Network Error at createError (node_modules/axios/lib/core/createError.js:16:15) at XMLHttpRequest.handleError [as onerror] (node_modules/axios/lib/adapters/xhr.js:87:14) at XMLHttpRequest.callback.(anonymous function) (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:289:32) at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:219:27) at invokeInlineListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:166:7) at EventTargetImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:122:7) at EventTargetImpl.dispatchEvent (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:87:17) at XMLHttpRequest.dispatchEvent (node_modules/jsdom/lib/jsdom/living/generated/EventTarget.js:61:35) at dispatchError (node_modules/jsdom/lib/jsdom/living/xmlhttprequest.js:994:9) at validCORSHeaders (node_modules/jsdom/lib/jsdom/living/xmlhttprequest.js:1009:7) at receiveResponse (node_modules/jsdom/lib/jsdom/living/xmlhttprequest.js:871:12) at Request.client.on.res (node_modules/jsdom/lib/jsdom/living/xmlhttprequest.js:691:38) at emitOne (events.js:96:13) at Request.emit (events.js:191:7) at Request.onRequestResponse (node_modules/request/request.js:1074:10) at emitOne (events.js:96:13) at ClientRequest.emit (events.js:191:7) at HTTPParser.parserOnIncomingClient (_http_client.js:522:21) at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23) at Socket.socketOnData (_http_client.js:411:20) at emitOne (events.js:96:13) at Socket.emit (events.js:191:7) at readableAddChunk (_stream_readable.js:178:18) at Socket.Readable.push (_stream_readable.js:136:10) at TCP.onread (net.js:560:20) ● returns json data expect.assertions(2) Expected two assertions to be called but only received zero assertion calls. at addAssertionErrors (node_modules/jest-jasmine2/build/setup-jest-globals.js:68:21) at process._tickCallback (internal/process/next_tick.js:109:7)``` 

在这个问题上我最好的猜测是,也许Jest不运行在节点环境(有什么办法,我可以弄清楚)? 所以也许E​​xpress服务器根本就没有运行。 但是,我有点超出了我的专业知识,所以这只是一个猜测罢了。 有人能够对真正发生的事情有所了解吗? 我的想法是运行一个好的服务器吗? 将它放在testing套件中是一个好主意吗? 如果对这两个问题中的一个或两个的回答是“否”,那么这里的最佳实践是什么?

你应该创build你的服务器beforeEach() (并停止在afterEach() ),以便它运行每个testing。

文档 。

您还应该select一个未使用的端口,以便testing可以并行运行。

    Interesting Posts