Eşzamansız işlev çağrılırken mocha testinde zaman aşımı nasıl önlenir Hata: 2000ms zaman aşımı aşıldı


201

Düğüm uygulamasında kodumu test etmek için mocha kullanıyorum. Mocha kullanarak birçok eşzamansız işlevi çağırırken, zaman aşımı hatası ( Error: timeout of 2000ms exceeded.) alıyorum . Bunu nasıl çözebilirim?

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();
        });

    });

});

bir uyum testi mi? bir testin yapılması için çok zaman vardır - belki saplamaları düşünmelisiniz - github.com/thlorenz/proxyquire size yardımcı olabilir.
surui

@surui teşekkür ederim ben bakacağım
sachin

Eşzamansız şeyler için vaatler kullanmanızı ve bunu test etmeyi tavsiye edebilir miyim Chai ile söz olarak
Krym

Yanıtlar:


345

Testinizi çalıştırırken zaman aşımını ayarlayabilirsiniz:

mocha --timeout 15000

Veya her bir paket veya her test için zaman aşımını programlı olarak ayarlayabilirsiniz:

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

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

Daha fazla bilgi için dokümanlara bakın .


3
kısa versiyonu -t. mokha'yı homurdanma görevinden çalıştırmak için mocha-testi kullanırsanız, bu seçenekler nesnesinde de desteklenir options:{timeout:15000}.
svassr

5
FYI: Ok fonksiyonlarını Mocha'ya geçirmek cesaretini kırıyor. mochajs.org/#arrow-functions
c0ming

4
Ok işlevleri yukarıdaki bağlantıda önerilmemektedir. Sadece ne yaptıklarını bilmeniz gerektiğini söylüyor, böylece içeriğe erişmeniz gerektiğinde yorulmuyorsunuz. Zaman aşımlarına dayanmak kırılgan olduğundan ve tüm testlerim birkaç ms'de çalıştığından içeriğe ihtiyacım yok, ancak sinon testi kullanırken aynı sorunla karşılaşıyorum. Yine de zamanın% 99'unu lambdas kullanıyor.
oligofren

26
TypeError: this.timeout is not a functionkullanırken"mocha": "^3.5.0"
Junior Mayhé

5
@adi ok işlevlerini kullanmadığınızdan emin misiniz? Zaman uyumsuz / beklemede dokümanlar içinde bu yüzden çalışması gerekir (ve vaat kullanmakla aynı şey). Yine de başka bir soru gibi geliyor.
Andreas Hultgren

80

Zaman aşımlarını artırmanın "çözümünün" burada olup bitenleri gizlediğini görüyorum,

  1. Kodunuz ve / veya şebeke çağrılarınız çok yavaş (iyi bir kullanıcı deneyimi için 100 ms'den kısa olmalıdır)
  2. İddialar (testler) başarısız oluyor ve Mocha onlar üzerinde harekete geçmeden önce bir şeyler hataları yutuyor.

Mocha bir geri çağrıdan onaylama hataları almadığında genellikle # 2 ile karşılaşırsınız. Bunun nedeni, istisnayı yığının yukarısına yutma gibi diğer bazı kodlardan kaynaklanır. Bununla baş etmenin doğru yolu kodu düzeltmek ve hatayı yutmamaktır .

Harici kod hatalarınızı yuttuğunda

Değiştiremediğiniz bir kütüphane işlevi olması durumunda, onaylama hatasını yakalamanız ve Mocha'ya kendiniz geçirmeniz gerekir. Bunu, bir geri çevirme bloğunda onay geri bildiriminizi sararak ve istisnaları yapılan işleyiciye ileterek yaparsınız.

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);
    }
  });
});

Bu kazan plakası elbette, testi göze biraz daha hoş hale getirmek için bazı faydalı fonksiyonlara çıkarılabilir:

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);
    }
}

Ağ testlerini hızlandırma

Bunun dışında, işleyen bir ağa güvenmek zorunda kalmadan testlerin geçmesini sağlamak için ağ çağrıları için test saplamaları kullanmaya başlama tavsiyesini almanızı öneririm. Mocha, Chai ve Sinon'u kullanarak testler şöyle görünebilir

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;
    });

});

Daha fazla bilgi için Sinan'ın nisebelgelerine bakın .


Testlerin büyük bir paketi var ve sadece done()sözün sonunda aradıkları emin olmak için özellikleri tüm sözleri geçti ve zaten Angular's $httpBackend, ancak şans kullanarak ağ çağrıları alay ediyorum . Her spesifikasyonu bir try-catch ile sarmak çok pragmatik görünmüyor. Başka öneriniz var mı? Teşekkürler!
Gustavo Matias

@GustavoMatias Sorununuzun ne olduğundan bahsetmediniz, sadece bunun yaşadığınız sorunlara bir çözüm olmadığını ifade ettiniz. Lütfen detaylandırın :-) Testleriniz yeterince hızlı başarısız değil mi? Bazen başarısız oluyorlar, ama nedenini bilmek istiyor musunuz? Neyi başarmak istediğinizi tahmin etmek zor.
oligofren

merhaba @oligofren! bu gerçekten de en iyi açıklama değildi. Sorunumun burada daha ayrıntılı bir açıklaması var stackoverflow.com/questions/34510048/… teşekkürler!
Gustavo Matias

"Genel olarak, bu sorunla başa çıkmanın en temiz yolu (ama en çirkin) yolu, kodunuzu bir deneme / yakalama ile sarmak ve yapılan işleyiciye istisnaları iletmektir." Hayır, bu en temiz yol değil. Uzun bir atışla değil. En temiz yol, istisnaları yutmayan kod yazmaktır. Ne zaman birisi Mocha'nın başarısız bir testi tespit etmediğinden şikayet ettiğinde, bunun istisnayı yutan bir şey olduğu için. Düzeltmek yerine test altındaki kodda hata etrafında bir try.... catch...çalışma ekleme .
Louis

@ Louis muhtemelen burada neden olabilir hakkında doğru olabilir, ama mavi dışında doğrulayamıyorum. Zaten insanlar Mocha ile ilgili bir sorun görünüşte bazı hata yakalamak yerine getiremediğini ve bu hallediyorum bir yoludur. verdiğiniz yaklaşım, hatayı yutan kodun bir kütüphane işlevi veya benzeri olmadığını varsayar, bu durumda bu çok kolay çözülmez.
oligofren

7

Biraz geç ama birisi bunu gelecekte kullanabilir ... Paketinizdeki komut dosyalarını güncelleyerek test zaman aşımı sürenizi artırabilirsiniz:

"scripts": { "test": "test --timeout 10000" //Adjust to a value you need }

Komutunuzu kullanarak testlerinizi yapın test


Benim için çalıştı! Teşekkürler!
RayLoveless

5

Ok işlevlerini kullanıyorsanız:

it('should do something', async () => {
  // do your testing
}).timeout(15000)

1

Benim için sorun aslında bir ok işlevi sağlandığında mocha'nın zaman aşımını kaçırmasına neden olan ve sürekli davranmayan açıklama işleviydi. (ES6 kullanarak)

Hiçbir söz reddedilmediğinden, açıklama bloğunda başarısız olan farklı testler için her zaman bu hatayı alıyordum

düzgün çalışmadığı zaman şöyle görünür:

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

ve bu anonim işlevi kullanarak çalışır

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

Umarım birine yardımcı olur, yukarıdakiler için yapılandırmam: (nodejs: 8.4.0, npm: 5.3.0, mocha: 3.3.0)


0

Sorunum yanıtı geri göndermiyordu, bu yüzden asılıydı. Express kullanıyorsanız res.send (data), res.json (data) ya da kullanmak istediğiniz api yönteminin test ettiğiniz rota için yürütüldüğünden emin olun.


0

Test senaryolarında kullanılan vaatleri çözdüğünüzden / reddettiğinizden, casuslar veya saplamalar olsun, çözdükleri / reddettiklerinden emin olun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.