node.js - Node e2e tests - async beforeEach/afterEach kroge mislykkes på Windows

Indlæg af Hanne Mølgaard Plasc

Problem



På OSX og Linux fungerer følgende godt (det er så forenklet en gengivelse som muligt, forhåbentlig uden at ofre mening):


import { expect } from 'chai';
import { MongoClient, Db } from 'mongodb';
import { Application, Request } from 'express';
import { Server } from 'http';
import * as config from 'config';

describe('some test', () =>
{
    let Session:{ new(app:Application):Request } = require('supertest-session'),
        app:Application,
        server:Server,
        mongoClient:MongoClient,
        db:Db;

    beforeEach(async () =>
    {
        app = express();
        server = app.listen(config.Http.port);
        request = new Session(app);

        // On Windows tests are executed before this resolves
        mongoClient = await MongoClient.connect(config.Database.connectionOptions.url);

        db = mongoClient.db(config.Database.connectionOptions.database);
    });

    afterEach(async () =>
    {
        await db.dropDatabase();
        request.destroy();
        server.close();
    });

    it('works like it oughtta', () =>
    {
        request.post('/api/account/login')
            .send({ email: 'me@example.com', password: 'password' })
            .expect(200)
            .then((res) =>
            {
                expect(res.success).to.eq(true);
            })
    })
});


På en Windows-maskine fejler ovenstående med følgende output fra npm:


13 verbose stack Exit status 4
13 verbose stack       at EventEmitter.<anonymous> (C:PathToAppDataRoaming
vmv9.4.0
ode\_modules
pm
ode\_modules
pm-lifecyclelibindex.js:285:16)
... rest of stack
13 verbose stack       at Process.ChildProcess.\_handle.onexit (internal/child\_process.js:220:5)


Hvis jeg tager databaseforbindelsen ud af beforeEach -krogen og gør dette i stedet, vil testen køre og passere, men jeg bemærker stadig svære fejl i yderligere test med async kroge:


before(function(done)
{
    MongoClient.connect(function(err, client)
    {
        mongoClient = client;
        done();
    });
});

after(function(done)
{
    mongoClient.close(function() { done(); });
});


Jeg har set denne adfærd ved hjælp af Mocha, Jest og FuseBox testløbere. Kørsel node@9.4 på begge maskiner. Løsningen på denne kan ikke være 'bare sørg for at jeg tester mine tests på en Windows-maskine, før jeg skubbe'.

Bedste reference