Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

using flowtype to statically check mocha test code

I have some complex Mocha code which I would like to statically check with FlowType because why not?

Below is a minimal repro:

/* @flow */

describe('it', function () {
    it('fails', function() {
        const s: number = 'flow spots this error';
    });
});

When I run Flow on this, Flow does indeed spot the problem with the assignment of string to number which shows that the approach is working to some extend.

However, I also get:

test/test.js:4
  4: describe('it', function () {
     ^^^^^^^^ identifier `describe`. Could not resolve name

test/test.js:5
  5:     it('fails', function() {
         ^^ identifier `it`. Could not resolve name

… apparently the Mocha test definitions run in an environment where these functions are globally available but looking at the test file there's nothing that would allow Flow to detect that.

I am not sure these problems are specific to Mocha but I don't feel I can confidently frame the question in broader terms, so my questions are:

  1. how can I have Flow type check Mocha test code without suppressing every line that contains describe or it ?
  2. is this is an instance of a broader class of situations and, if so, what would the latter be?
like image 894
Marcus Junius Brutus Avatar asked Nov 17 '16 22:11

Marcus Junius Brutus


People also ask

How do I run a specific test file in mocha?

Run a Single Test File Using the mocha cli, you can easily specify an exact or wildcarded pattern that you want to run. This is accomplished with the grep option when running the mocha command. The spec must have some describe or it that matches the grep pattern, as in: describe('api', _ => { // ... })

Do mocha tests run in order?

Mocha will run the tests in the order the describe calls execute. @Gnucki Alphabetical order is, by definition, not random.

What is describe and it in mocha?

In Mocha, the describe() function is used to group tests. It accepts a string to describe the group of tests and a callback function which contains it() tests. Calls to describe() are commonly nested to resemble the structure of the code being tested.


1 Answers

Third-party libraries usually need definition files, i.e. files containing all the type information for a given library.

In this case, you need a definition file for mocha, which fortunately is provided by flow-typed.

Install it with

npm install -g flow-typed

then run

flow-typed install 

It will automatically install all the available definition files for your dependencies, including mocha.

like image 168
Gabriele Petronella Avatar answered Sep 27 '22 16:09

Gabriele Petronella