Mocha'da tek bir test vakası için zaman aşımı nasıl artırılır


405

Bir test durumunda bir ağ isteği gönderiyorum, ancak bu bazen 2 saniyeden uzun sürüyor (varsayılan zaman aşımı).

Tek bir test senaryosunun zaman aşımını nasıl artırabilirim?

Yanıtlar:


669

Buyrun: http://mochajs.org/#test-level

it('accesses the network', function(done){
  this.timeout(500);
  [Put network code here, with done() in the callback]
})

Ok fonksiyonu için aşağıdaki gibi kullanın:

it('accesses the network', (done) => {
  [Put network code here, with done() in the callback]
}).timeout(500);

23
zaman aşımı milisaniye cinsindendir ve varsayılan olarak 2000'dir.
Ethan Mick

47
Es6 ok işlevlerini kullanıyordum ve "this" in çalışması için eski 'function' tanımlarına geri dönmek zorunda kaldım.
Aruna Herath

1
Ayrıca kancalar için de çalışırbefore(function(done){this.timeout(5 * 1000);...});
JP

2
@AH ok fonksiyonu çalışması vermedi sebebi biridir bu sözcük
Tanner Faulkner

11
ok işlevi ile çalışmak için bir yolu var mı? düzenleme: .timeout(500)sonuna ekleit(...).timeout(500)
chovy

136

Es6 ok işlevlerini kullanmak istiyorsanız, tanımınızın .timeout(ms)sonuna a ekleyebilirsiniz it:

it('should not timeout', (done) => {
    doLongThing().then(() => {
        done();
    });
}).timeout(5000);

En azından bu dizgide çalışıyor.


3
Bu çalışır, ancak .timeoutmocha için DefinitelyTyped yazımlarına dahil değildir: i.imgur.com/jQbWCn1.png - Normal bir eski işlevle this.timeout(2000)veya this.slow(500)düzenli bir şekilde kullanmak veya hatasız derler
Leon Adler

3
Ne yazık ki, bu sadece işe yarıyor it, işe yaramıyor describe.
robrich

3
için bunu yapmanın bir yolu var describe()ya context()?
chovy

1
@LeonAdler .timeoutşimdi de DefinitelyTyped en Mocha typings dahildir: Mocha.IRunnable. Bununla birlikte, bu testleri çalıştırmak için Webstorm IDE'yi kullanıyorsanız, bir uyarı notu: Hangi nedenle olursa olsun, WebStorm'un Mocha entegrasyon eklentisi hala .timeout()ekli Mocha testlerini tanımıyor (yani yanlarında 'çalıştırma' düğmesi görünmüyor), ve böylece this.timeout()onun yerine kullanımına izin vermek için ok işlevlerinden kaçınmayı savunuyorum .
Jamie Birch

Bu harika. Bir vaat döndüren zaman uyumsuzluk fonksiyonu için bitmiş () bırakabilirsiniz.
billoverton

72

(bugün bununla karşılaştığımdan beri)

ES2015 yağ oku sözdizimini kullanırken dikkatli olun:

Bu başarısız olur:

it('accesses the network', done => {

  this.timeout(500); // will not work

  // *this* binding refers to parent function scope in fat arrow functions!
  // i.e. the *this* object of the describe function

  done();
});

EDIT: Neden başarısız:

@Atoth yorumlardaki bahisler gibi, yağ ok işlevleri kendi yok bu bağlayıcı. Bu nedenle, mümkün değil o kadar bağlama işlevin bu geri arama ve sağlamak zaman aşımı işlevi.

Alt satır : Artan zaman aşımı gerektiren işlevler için ok işlevlerini kullanmayın.


2
Çünkü ok fonksiyonlarında buna hiç sahip değil. Daha fazla bilgiyi
atoth

2
Evet ama cevapta bunu açıkladım. Yorumuma bakın. // kodun içinde. Muhtemelen daha net hale getirmek için kod bloğunun dışında açıklamalıyım. bu var ama dış kapsamdan geliyor.
16:59

1
Açıklamam daha doğru. thisOk işlevleri üzerinde bir bağ yoktur - aynı şekilde bir çeşit, sadece farklı olduklarını düşündürmez. Sadece sözcüksel kapsamları var. Varolmayanları bağlayamazsınız. Bu yüzden .bind, .callvs. onunla çalışmaz.
atoth

1
Bu doğru - ve haklısın daha doğru. Thanks
chriskelly

1
Bu yüzden şişman okları sadece ihtiyacınız olduğunda kullanmanız gerektiğini söyleyebilirim, ama ne thisolduğunu takip ettim .
xdumaine

42

NodeJS'de kullanıyorsanız, package.json içinde zaman aşımı süresini ayarlayabilirsiniz

"test": "mocha --timeout 10000"

o zaman npm kullanarak çalıştırabilirsiniz:

npm test

1
Bu, tüm test
senaryoları

Bunun soruya cevap vermediğini kabul ettim, ancak tüm testler için artıp artmadığını umursamadığım kullanım durumum için yeterliydi. Bence burada bir sürü insan tek bir test mi yoksa hepsi için mi umurumda olmayabilir, bu yüzden bu cevabın burada olduğunu takdir ediyorum.
billoverton

22

Komut satırından:

mocha -t 100000 test.js

14
Bu , sorunun sorduğu gibi "belirli bir test durumu için" yerine tüm test durumları için zaman aşımını artırır .
Louis

16

Farklı bir yaklaşım benimsemeyi ve ağ kaynağına yapılan çağrıyı bir saplama veya sahte nesne ile değiştirmeyi de düşünebilirsiniz. Sinon'u kullanarak , geliştirme çabalarınıza odaklanarak uygulamayı ağ hizmetinden ayırabilirsiniz.


7
Tamamen alakasız değil ; sık sık, ağ yanıtını saptamak mantıklıdır, böylece makinenin hazır olmasına veya doğru yanıtı döndürmesine güvenmemeniz gerekir. Bununla birlikte, yanıtın kendisini test ediyorsanız, evet, yine de yapmanız gerekir.
aendrew

2
Bazı entegrasyon testleri oluşturmak için sinon / mocha kullanıyorum, bu yüzden daha yüksek zaman aşımları önemlidir.
jcollum

9

Aşağıdakilerin test edilmesinde Express:

const request = require('supertest');
const server = require('../bin/www');

describe('navegation', () => {
    it('login page', function(done) {
        this.timeout(4000);
        const timeOut = setTimeout(done, 3500);

        request(server)
            .get('/login')
            .expect(200)
            .then(res => {
                res.text.should.include('Login');
                clearTimeout(timeOut);
                done();
            })
            .catch(err => {
                console.log(this.test.fullTitle(), err);
                clearTimeout(timeOut);
                done(err);
            });
    });
});

Örnekte test süresi 4000'dir (4s).

Not: test süresi içinde çağrıldığından setTimeout(done, 3500)daha küçüktür done, ancak clearTimeout(timeOut)tüm bu zamanlardan kaçının.


2

Bu benim için çalıştı! Daha önce çalışması için hiçbir şey bulunamadı ()

describe("When in a long running test", () => {
  it("Should not time out with 2000ms", async () => {
    let service = new SomeService();
    let result = await service.callToLongRunningProcess();
    expect(result).to.be.true;
  }).timeout(10000); // Custom Timeout 
});

.timeout () mükemmel çalıştı!
acidjazz
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.