Як збільшити час очікування для одного тестового випадку в мокко


405

Я надсилаю мережевий запит у тестовому випадку, але іноді це займає більше 2 секунд (тайм-аут за замовчуванням).

Як збільшити час очікування для одного тестового випадку?

Відповіді:


669

Ось вам: http://mochajs.org/#test-level

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

Для функції стрілки використовуйте наступне:

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

23
тайм-аут перебуває в мілісекундах, і він за замовчуванням 2000 р.
Етан Мік,

47
Я використовував функції стрілок es6 і мені довелося повернутися до старих визначень функцій, щоб "це" працювало.
Аруна Герат

1
Також працює для гачків, якbefore(function(done){this.timeout(5 * 1000);...});
JP

2
@AH Причина, що функція стрілки не спрацювала, є через лексичне це
Таннер Фолкнер,

11
чи є спосіб змусити його працювати з функцією стрілки? редагувати: додати .timeout(500)до кінцяit(...).timeout(500)
chovy

136

Якщо ви бажаєте скористатися функціями стрілки es6, ви можете додати .timeout(ms)до кінця свого itвизначення:

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

Принаймні, це працює в Typescript.


3
Це працює, але .timeoutне входить до типових наборів для mocha: i.imgur.com/jQbWCn1.png - Використання this.timeout(2000)або this.slow(500)зі звичайною старою функцією працює і збирається без помилок
Леон Адлер

3
На жаль, це працює лише для цього it, але не працює describe.
robrich

3
є спосіб це зробити для describe()або context()?
човен

1
@LeonAdler .timeoutтепер включений в Мокко типізації DefinitelyTyped за адресою: Mocha.IRunnable. Однак якщо для запуску цих тестів ви використовуєте IDE Webstorm IDE, будьте обережні: з будь-якої причини плагін інтеграції Mocha WebStorm все ще не розпізнає .timeout()додані тести Mocha (це означає, що поруч із ними не з’являється кнопка "запустити"), і, отже, я прихиляюсь уникати функцій стрілок, щоб дозволити їх використання this.timeout().
Джеймі Береза

Це ідеально. Для функції асинхронізації, що повертає обіцянку, ви можете залишити її ().
Білловертон

72

(оскільки я сьогодні зіткнувся з цим)

Будьте обережні, використовуючи синтаксис жирної стрілки ES2015:

Це не вдасться:

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: Чому це не вдається:

Як @atoth згадує в коментарях, жир стрілок функція не має свої власний це зв'язування. Тому функція it не може прив'язуватися до цього зворотного дзвінка та надавати функцію тайм-ауту .

Підсумок : не використовуйте стрілочні функції для функцій, які потребують збільшення часу.


2
Тому що функцій зі стрілками цього взагалі немає. Детальніше тут: blog.getify.com/arrow-this
atoth

2
Так, але я пояснив це у відповіді. Дивіться мій коментар. // всередині коду. Я, мабуть, повинен пояснити це поза блоком коду, щоб зробити його більш зрозумілим. це існує, але це виходить із зовнішньої сфери.
chriskelly

1
Моє пояснення точніше. Немає thisприв'язки до функцій стрілок - не однаковий спосіб підказав би, що вони мають якісь, просто різні. Вони мають лише лексичні сфери застосування. Ви не можете зв'язати це неіснуюче. Ось чому .bindі .callт. Д. Не працює з цим.
atoth

1
Це правда - і ваше право це точніше. Дякую
chriskelly

1
Я б сказав, що саме тому ви повинні використовувати жирові стрілки лише тоді, коли вони вам потрібні, але я втратив слідку про те, що thisє.
xdumaine

42

Якщо ви використовуєте в NodeJS, тоді ви можете встановити тайм-аут у package.json

"test": "mocha --timeout 10000"

тоді ви можете запустити за допомогою npm, наприклад:

npm test

1
Це для всіх тестових випадків, не один тестовий випадок
garryp

Погодився, що це не відповідає на питання, але це було достатньо для мого використання, коли мені було байдуже, чи збільшиться він для всіх тестів. Я думаю, що багатьом людям, які опиняються тут, може бути байдуже, чи це один тест, чи все, тому я ціную цю відповідь тут.
Білловертон

22

З командного рядка:

mocha -t 100000 test.js

14
Це збільшує час очікування для всіх тестових випадків, а не "для конкретного тестового випадку", як задається питанням.
Луї

16

Ви також можете подумати про інший підхід та заміну дзвінка на мережевий ресурс на об'єкт заглушки або макету. Використовуючи Sinon , ви можете від’єднати додаток від послуги мережі, зосереджуючи свої зусилля на розробці.


7
Це не зовсім не має значення; часто має сенс заглушити відповідь мережі, щоб ви не покладалися на те, що машина працює або повертає правильну відповідь. Якщо ви протестуєте саму відповідь, то так, це все одно потрібно зробити.
aendrew

2
Я використовую sinon / mocha, щоб створити деякі інтеграційні тести, тому більш актуальні терміни.
jcollum

9

Для випробування на 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);
            });
    });
});

У прикладі час випробування становить 4000 (4s).

Примітка: setTimeout(done, 3500)незначне значення, ніж doneназивається протягом випробування, але clearTimeout(timeOut)воно уникає, ніж використовувалося весь цей час.


2

Це працювало для мене! Не вдалося знайти нічого, щоб з цим працювати ()

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 () працював чудово!
acidjazz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.