javascript - Mocha epäonnistuu jatkuvasti absoluuttisten polkujen takia


Minulla on suuria vaikeuksia käyttää Enzymea ja Mochaa testatakseni React-projektiani. Minulla on testi, joka näyttää tältä:

import React from 'react';
import { expect } from 'chai';
import { shallow } from 'enzyme';

import { ChipInput} from '../client/components/Chips';

describe('<ChipInput />', _ => {
  it('rocks', done => {
    done();
  });
});

Ja kun ChipInput tuodaan, tuo tiedosto tuo jotain absoluuttisella polulla, esim. /lib/collections/tags, ja sitten Mocha antaa virheen, koska se ilmeisesti toimii vain suhteellisten polkujen kanssa. Miten saan tämän toimimaan?

MUOKKAA :

Varsinainen virhe:

Error: Cannot find module '/lib/collections/tags'

Tämä tapahtuu, koska /tests/ChipInput-test.js tuo ChipInput-komponentin tiedostosta /client/components/Chips/index.js, jossa on seuraavat rivit:

import React from 'react';
import {
  MapsLocalOffer as TagIcon,
  ImageRemoveRedEye as InsightIcon,
  EditorInsertChart as TestIcon,
  SocialPerson as UserIcon,
} from 'material-ui/svg-icons';

import { Tag } from '/lib/collections/tags'; // error thrown here
import { Insight } from '/lib/collections/insights';
// import { Test } from '/lib/collections/tests';
import Chip from './Chip';
import ChipDisplay from './ChipDisplay';
import ChipInput from './ChipInput';
import * as chipTypes from './chip-types';

Vastaus #1

Kenelle tahansa, joka päätyy tänne Googlesta, vaikka ffxsamin vastaus toimii, on monia tapoja saavuttaa tämä. Noden require sallii perustan asettamisen joko ympäristömuuttujan kautta tai ohjelmallisesti, mikä mahdollistaa yksinkertaiset absoluuttiset polut, jotka eivät vaadi johtavaa kauttaviivaa (require("my/module"); vs require("/my/module");).

Käytän gulpia tehtävien ajajana, joten suosikkitekniikkani on käyttää app-module-path-moduulia seuraavasti gulp-tiedostoni alussa (tämä toimii missä tahansa, kunhan et ole vielä käyttänyt absoluuttisia require-kutsuja):

require('babel-core/register'); //for mocha to use es6

require('app-module-path').addPath(__dirname + '/src'); //set root path

//I also use webpack to pull in other extensions, so I
//want mocha to noop out on them
require.extensions['.css'] = _.noop;
require.extensions['.scss'] = _.noop;
require.extensions['.png'] = _.noop;
require.extensions['.jpg'] = _.noop;
require.extensions['.jpeg'] = _.noop;
require.extensions['.gif'] = _.noop;

Saadaksesi täydellisemmän katsauksen, katso tämä gist GitHub-käyttäjältä branneman: https://gist.github.com/branneman/8048520

Vastaus #2

Tähän on kulunut jonkin aikaa, mutta haluan jakaa ratkaisuni täällä, varmuuden vuoksi, jos kaikki yllä olevat ratkaisut eivät toimi sinun erityistilanteessasi. Etsin ratkaisua yksikkötestimme korjaamiseen, joka epäonnistui virheellä "Error: Cannot find module 'components/shared/xyz'", koska 'components'-kansio on 'client/src'-kansion alla, joten keksin seuraavan ratkaisun, joka toimii meille.

npm install babel-plugin-module-resolver --save-dev

{
  'plugins': [
      'babel-plugin-module-resolver',
      { 'root': ['client/src'] }
   ]
}