2015-08-26 8 views
63

Sono nuovo a Mocha e sto cercando di usarlo per testare un semplice componente React. Il test passerebbe se il componente reagire non ha stile CSS, ma getta un errore di sintassi se il tag all'interno del componente Reagire contiene alcun className:Test di Mocha falliti a causa di css nel pacchetto web

Testing.react.js

import React from 'react'; 

export default class Testing extends React.Component { 
    render() { 
    return (
     <section> 
     <form> 
      <input type="text" /> 
     </form> 
     </section> 
    ); 
    } 
} 

testing.jsx

import { 
    React, 
    sinon, 
    assert, 
    expect, 
    TestUtils 
} from '../../test_helper'; 

import TestingSample from '../../../app/components/Testing.react.js'; 

describe('TestingSample component', function(){ 
    before('render and locate element', function(){ 
     var renderedComponent = TestUtils.renderIntoDocument(
      <TestingSample /> 
     ); 

     var inputComponent = TestUtils.findRenderedDOMComponentWithTag(
      renderedComponent, 'input' 
     ); 

     this.inputElement = inputComponent.getDOMNode(); 
    }); 

    it('<input> should be of type "text"', function() { 
     assert(this.inputElement.getAttribute('type') === 'text'); 
    }); 
}) 

il test sarebbe passato:

> mocha --opts ./test/javascripts/mocha.opts --compilers js:babel/register --recursive test/javascripts/**/*.jsx 


    TestSample component 
    ✓ <input> should be of type "text" 


    1 passing (44ms) 

dopo ho aggiunto il className all'interno del tag input un errore si presenta: risultato

import React from 'react'; 
import testingStyle from '../../scss/components/landing/testing.scss'; 

export default class Testing extends React.Component { 
    render() { 
    return (
     <section> 
     <form> 
      <input type="text" className="testingStyle.color" placeholder="Where would you like to dine" />  
     </form> 
     </section> 
    ); 
    } 
} 

prova:

SyntaxError: /Users/../../../Documents/project/app/scss/components/landing/testing.scss: Unexpected token (1:0) 
> 1 | .color { 
    |^
    2 | color: red; 
    3 | } 

Ho cercato online, ma senza fortuna finora. Mi sto perdendo qualcosa? Per favore aiutami o indicami la giusta direzione sarebbe molto apprezzato. Attualmente sto usando:
Nodo Express Server
Reagire
React-router
Webpack
Babel
Mocha
Chai
Sinon
Sinon-Chai

+0

Hai provato pacchetto web-require? https://github.com/petehunt/webpack-require – ctrlplusb

risposta

123

C'è un gancio babel/register stile di ignorare le importazioni di stile:

https://www.npmjs.com/package/ignore-styles

installarlo:

npm install --save-dev ignore-styles

test eseguito senza stili:

mocha --require ignore-styles

+1

funziona come un incantesimo!grazie per questo :) –

+1

Ciò mi fa risparmiare la giornata. E questa correzione funziona anche per Istanbul. Grazie! – lazurey

+3

E se volessi testare anche i miei stili? – thevangelist

3

Dal momento che si sta utilizzando webpack , utilizzare null-loader per caricare null quando il webpack incontra un file CSS/LESS/SASS/etc richiesto nei componenti. Installare tramite NPM e quindi aggiornare il config webpack per includere il caricatore:

{ 
    test: /(\.css|\.less|.\scss)$/, 
    loader: 'null-loader' 
} 

Ovviamente questo ti impedirà di carico CSS nell'applicazione reale, in modo che si vorrà avere una configurazione webpack separato per il vostro pacco test che usa questo caricatore

+0

L'ho provato, non sembra funzionare. Inoltre, ho notato che l'errore non è causato dall'aggiunta di className ai componenti. È causa importando il file css: 'import testingStyle da '../../ scss/components/landing/testing.scss';' –

9

è possibile utilizzare un compilatori css correre moka, i js compilatore come segue:

css-DNT-compilatore.js

function donothing() { 
    return null; 
} 

require.extensions['.css'] = donothing; 
require.extensions['.less'] = donothing; 
require.extensions['.scss'] = donothing; 
// ..etc 

ed eseguire il comando moka in questo modo:

mocha --compilers js:babel-core/register,css:css-dnt-compiler.js --recursive 
+0

Risposta fantastica. –

+0

Questa soluzione ha funzionato per me, l'unica cosa che devi accertarti è di includere il percorso corretto per il file 'css-dnt-compiler', quindi nel mio caso l'ho memorizzato all'interno della cartella' test', quindi il comando diventa: 'mocha --compiler js: babel-core/register, css: test/css-dnt-compiler.js --recursive' –

6

My same answer as here, questo è ciò che ho usato per ottenere a lavorare su Babel 6

package.json

"scripts": { 
    "test": "mocha --compilers js:babel-core/register 
      --require ./tools/testHelper.js 'src/**/*[email protected](js|jsx)'", 

strumenti/testHelper.js

// Prevent mocha from interpreting CSS @import files 
function noop() { 
    return null; 
} 

require.extensions['.css'] = noop; 

Ciò consente di avere i test all'interno della cartella src accanto ai componenti. Puoi aggiungere tutte le estensioni che desideri con require.extensions.

+1

se 'noop()' restituisce '{}' invece, puoi anche usarlo per deridere i nomi di classe. Quindi, per esempio, se hai usato 'import stili da 'my.css'', puoi impostare' styles.myClassName' nella tua suite di test, e il tuo componente di reazione che fa riferimento allo stesso modulo CSS vedrà quei valori. Questo è super utile quando si usano selettori di classe in framework di test come Enzyme – killthrush

+0

Funziona bene. Ho spostato tutte le opzioni di mocha su mocha.opts per rendere gli script puliti. –

+0

sei un risparmiatore di vita grazie – lfender6445

0

Nessuna di queste soluzioni ha funzionato per me, poiché sto utilizzando mocha-webpack e non accetta l'opzione "--compiler". Ho implementato il pacchetto ignore-styles, come descritto nella risposta più popolare, ma sembrava inerte, senza alcuna differenza nel mio rapporto sulla copertura di Istanbul (file .less ancora in fase di test).

Il problema è il .less loader che stavo usando nel mio file webpack.config.test.js. Basta scambiare meno caricatore per null-loader risolto il mio problema.

module: { 
    rules: [ 
     { 
      test: /\.less$/, 
      use: ['null-loader'] 
     } 
    ] 
} 

Per me, questo è di gran lunga la soluzione più semplice, e gli obiettivi la mia configurazione di test direttamente, piuttosto che dover modificare/aggiungere agli script package.json, o peggio, aggiungere nuovi file .js.

+0

Mi sembra questa la stessa soluzione di quella pubblicata due anni fa da [Jim Skerritt] (https://stackoverflow.com/a/32236924/1906307): sostituisci il caricatore con 'null-loader'. – Louis

0

Un modo semplice consiste nell'importare "ignore-styles"; nelle classi di test ..

1

Per coloro che cercano come gestire questo in jest - basta aggiungere un gestore per i file di stile:

// package.json 
{ 
    "jest": { 
    "moduleNameMapper": { 
     "\\.(css|less|scss|sass)$": "<rootDir>/__mocks__/styleMock.js" 
    } 
    } 
} 

// __mocks__/styleMock.js 
module.exports = {}; 

Più here.

Problemi correlati