2015-03-17 4 views
8

Ho problemi a capire perché questo test non sta passando.Babel/Karma/Chai restituisce TypeError: non è possibile accedere alle proprietà 'caller', 'callee' e 'arguments' su funzioni in modalità rigorosa

var expect = require('chai').expect; 

describe('HelloComponent', function() { 

    it('passes a quite simple test', function() { 
    expect(1 + 4).to.equal(5); 
    }); 

}); 

produce questo errore:

DEBUG [web-server]: serving: /Users/ivan/dev/react-starter/node_modules/karma/static/context.html 
DEBUG [web-server]: serving (cached): /Users/ivan/dev/react-starter/node_modules/mocha/mocha.js 
DEBUG [web-server]: serving (cached): /Users/ivan/dev/react-starter/node_modules/karma-mocha/lib/adapter.js 
DEBUG [web-server]: serving (cached): /Users/ivan/dev/react-starter/test/front-end/tests.webpack.js 
Chrome 41.0.2272 (Mac OS X 10.10.2) HelloComponent passes a quite simple test FAILED 
     TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them 
      at new Assertion (/Users/ivan/dev/react-starter/test/front-end/tests.webpack.js:2166:43 <- webpack:///~/chai/lib/chai/assertion.js:33:42) 
      at chai.expect (/Users/ivan/dev/react-starter/test/front-end/tests.webpack.js:3592:13 <- webpack:///~/chai/lib/chai/interface/expect.js:9:11) 
      at Context.<anonymous> (/Users/ivan/dev/react-starter/test/front-end/tests.webpack.js:89:6 <- webpack:///test/front-end/hello-spec.js:10:4) 

Potrebbe avere qualcosa a che fare con le cose babele di avvolgimento in modalità rigorosa?

Qualcuno sa quali passi posso iniziare a prendere per capire cosa sta succedendo qui?

Il codice è open source ed è disponibile qui: https://github.com/UWFosterIT/react-starter/tree/gulp-webpack

da installare e riprodurre questo errore:

git clone https://github.com/UWFosterIT/react-starter.git 
npm install 
gulp test:karma 

risposta

9

sto usando moduli Babel e ES6. Il codice ES6 è una modalità implicitamente rigida. La libreria di asserzione di Chai non è compatibile con la modalità strict come è stata impostata sopra.

La soluzione è di ignorare/non comprendere node_modules nel caricatore webpack babele:

Questa è la sezione dedicata del mio karma.conf.js:

webpack: { 
    // any necessary webpack configuration 
    devtool: 'inline-source-map', 
    module: { 
    loaders: [ 
     { test: /\.js$/, loader: 'babel', exclude: /node_modules/ } 
    ] 
    } 
}, 

Il esclude è un test regex invece di una semplice stringa.

+1

Quindi non è possibile testare i propri moduli es6 utilizzando le asserzioni chai, giusto? Posso vedere che funziona con lo stile 'assert' ma non' expect'. – konrad

0

Ho faticato con questo per circa un giorno, poi mi sono reso conto che non è necessario importare/richiedere chai. È già disponibile così come lo è il numero describe di jasmine.

Basta rimuovere la riga var expect = require('chai').expect; in modo da lasciare la specifica/prova di seguito.

describe('HelloComponent', function() { 

    it('passes a quite simple test', function() { 
    expect(1 + 4).to.equal(5); 
    }); 

}); 

avevo guardato tanti diversi esempi di Webpack 2 + Karma + Chai che ho perso il fatto che non avevo bisogno di importarlo

0

Installazione chai correttamente risolto il problema per me:

$ npm i -D chai 
+-- [email protected] 
| +-- [email protected] 
| +-- [email protected] 
| | `-- [email protected] 
| +-- [email protected] 
| +-- [email protected] 
| `-- [email protected] 
`-- [email protected] 
    `-- [email protected] 
    +-- [email protected] 
    | `-- [email protected] 
    `-- [email protected] 

Per provare chai con le richieste http, ho installato solo chai-http. E non lo chai stesso. Ma sono state utilizzando sia di loro:

'use strict'; 

const chaiHttp = require('chai-http'); 
const chai = require('chai'); 
const expect = chai.expect; 
chai.use(chaiHttp); 

Così ho provato a installare chai esplicitamente e apparentemente risolto il problema. Posso usare expect e l'errore non viene più generato.