Vraag In mokka testen terwijl het bellen asynchrone functie hoe de time-out te voorkomen Fout: time-out van 2000ms overschreden


In mijn knooptoepassing gebruik ik mokka om mijn code te testen. Hoewel ik veel asynchrone functies gebruik met mokka, krijg ik een time-outfout (Error: timeout of 2000ms exceeded.). Hoe kan ik dit oplossen?

var module = require('../lib/myModule');
var should = require('chai').should();

describe('Testing Module', function() {

    it('Save Data', function(done) {

        this.timeout(15000);

        var data = {
            a: 'aa',
            b: 'bb'
        };

        module.save(data, function(err, res) {
            should.not.exist(err);
            done();
        });

    });


    it('Get Data By Id', function(done) {

        var id = "28ca9";

        module.get(id, function(err, res) {

            console.log(res);
            should.not.exist(err);
            done();
        });

    });

});

161
2018-05-17 10:40


oorsprong


antwoorden:


U kunt de time-out instellen wanneer u uw test uitvoert:

mocha --timeout 15000

Of u kunt de time-out voor elke suite of elke test programmatisch instellen:

describe('...', function(){
  this.timeout(15000);

  it('...', function(done){
    this.timeout(15000);
    setTimeout(done, 15000);
  });
});

Zie voor meer informatie de docs.


290
2018-05-17 11:02



Ik vind dat de "oplossing" van alleen maar het vergroten van de time-outs verduistert wat er hier echt aan de hand is, en dat is het ook

  1. Uw code en / of netwerkoproepen zijn veel te traag (moet 100 ms zijn voor een goede gebruikerservaring)
  2. De beweringen (tests) schieten tekort en iets slikt de fouten op voordat Mocha in staat is om ze op te volgen.

Meestal kom je # 2 tegen wanneer Mocha geen assertiefouten van een callback ontvangt. Dit wordt veroorzaakt door een andere code die de uitzondering verder door de stapel slikt. De juiste manier om hiermee om te gaan is om de code te repareren en de fout niet in te slikken.

Wanneer externe code uw fouten opslokt

Als het een bibliotheekfunctie is die u niet kunt wijzigen, moet u de assertiefout vastleggen en deze zelf aan Mocha doorgeven. Dit doet u door uw assertion-callback in een try / catch-blok te verpakken en eventuele uitzonderingen aan de voltooide handler door te geven.

it('should not fail', function (done) { // Pass reference here!

  i_swallow_errors(function (err, result) {
    try { // boilerplate to be able to get the assert failures
      assert.ok(true);
      assert.equal(result, 'bar');
      done();
    } catch (error) {
      done(error);
    }
  });
});

Deze boilerplate kan natuurlijk worden geëxtraheerd in een utiliteitsfunctie om de test een beetje aangenamer te maken voor het oog:

it('should not fail', function (done) { // Pass reference here!
    i_swallow_errors(handleError(done, function (err, result) {
        assert.equal(result, 'bar');
    }));
});

// reusable boilerplate to be able to get the assert failures
function handleError(done, fn) {
    try { 
        fn();
        done();
    } catch (error) {
        done(error);
    }
}

Netwerktests versnellen

Verder adviseer ik om het advies op te nemen over het gebruik van teststubs voor netwerkoproepen om tests te laten slagen zonder te moeten vertrouwen op een functionerend netwerk. Met behulp van Mocha, Chai en Sinon kunnen de testen er ongeveer zo uitzien

describe('api tests normally involving network calls', function() {

    beforeEach: function () {
        this.xhr = sinon.useFakeXMLHttpRequest();
        var requests = this.requests = [];

        this.xhr.onCreate = function (xhr) {
            requests.push(xhr);
        };
    },

    afterEach: function () {
        this.xhr.restore();
    }


    it("should fetch comments from server", function () {
        var callback = sinon.spy();
        myLib.getCommentsFor("/some/article", callback);
        assertEquals(1, this.requests.length);

        this.requests[0].respond(200, { "Content-Type": "application/json" },
                                 '[{ "id": 12, "comment": "Hey there" }]');
        expect(callback.calledWith([{ id: 12, comment: "Hey there" }])).to.be.true;
    });

});

Zien Sinon's nise docs voor meer informatie.


74
2017-12-09 11:50



Voor mij was het probleem eigenlijk de functie beschrijven, welke, indien voorzien van een pijlfunctie, ervoor zorgt dat mokka de mist mist time-out en gedragen zich niet consequent. (Met behulp van ES6)

aangezien geen enkele belofte werd verworpen kreeg ik deze fout de hele tijd voor verschillende tests die faalden in het beschrijvingsblok

dus hoe ziet het eruit als het niet goed werkt:

describe('test', () => { 
 assert(...)
})

en dit werkt met behulp van de anonieme functie

describe('test', function() { 
 assert(...)
})

Ik hoop dat het iemand helpt, mijn configuratie voor het bovenstaande: (knooppunt: 8.4.0, npm: 5.3.0, mokka: 3.3.0)


1
2017-09-24 17:12