JavaScript Standard Style does not recognize Mocha-ThrowExceptions

Exception or error:

I have a Mocha test file that looks like this:

var expect = require('chai').expect
var muting = require('../muting')

describe('muting', function () {
  describe('init()', function () {
    it('should inject an object into twitter', function () {
      var twitter = 'twitter'
      muting.init(twitter)
      expect(muting.twitter).to.equal(twitter)
    })
  })
})

When I run mocha from the CLI, it runs the test successfully.

When I run standard (the executable for JavaScript Standard Style) I get errors on Mocha’s framework functions like so:

standard: Use JavaScript Standard Style (https://github.com/feross/standard)   
c:\..\test\index.js:5:0: 'describe' is not defined.  
c:\..\test\index.js:6:2: 'describe' is not defined.  
c:\..\test\index.js:7:4: 'it' is not defined.

What’s the cleanest way to make Standard not complain about these functions?

How to solve:

Actually, you don’t need to list every single global variable in your package.json

You can specify environments instead like this:

"standard": {
  "env": [ "mocha" ]
}

Source: Official ESLint configuration docs.

###

I prefer to edit my .eslintrc and add mocha to env section:

...
"env": {
  "commonjs": true,
  "node": true,
  "mocha": true
},
...

this way my package.json file is kept clean, also vscode plugin for eslint understands it better

###

while eslint’s comment configuration works great for a single file, I prefer to use standard’s package.json globals configuration to do this for my projects. E.g.

{
  "name": "my-package",
  "version": "1.0.0",
  "standard": {
    "globals": [
      "describe",
      "context",
      "before",
      "beforeEach",
      "after",
      "afterEach",
      "it",
      "expect"
    ]
  }
}

###

for eslint use this line on the beginning of test_file.js

/* eslint-env mocha */

###

You can use the same solution as for web workers

/* global describe it */
var expect = require('chai').expect
var muting = require('../muting')

describe('muting', function () {
  describe('init()', function () {
    it('should inject an object into twitter', function () {
     var twitter = 'twitter'
     muting.init(twitter)
     expect(muting.twitter).to.equal(twitter)
    })
  })
})

###

As pointed out by Nick Tomlin you just need to declare globals.

I use to put it in the command line, since I have different globals for tests as for sources or different parts of the project.

For tests we should use

standard --global describe --global it test/

elsewhere in my project I want to lint code that uses jQuery so I use

standard --global $ src/client/

Bonus tip

If you are using vim with Syntastic you maybe want to add to your .vimrc

let b:syntastic_checkers = ['standard']
let g:syntastic_javascript_standard_args = "--global $ --global it --global describe"

Leave a Reply

Your email address will not be published. Required fields are marked *