Как увеличить время ожидания для одного теста в мокко


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 и должен был вернуться к старым определениям 'function', чтобы "this" работало.
Аруна Герат

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не включено в типизацию DefiniteTyped для mocha: i.imgur.com/jQbWCn1.png - Использование this.timeout(2000)или this.slow(500)с обычной старой функцией работает и компилируется без ошибок
Леон Адлер

3
К сожалению, это работает только для it, это не работает для describe.
Робрич

3
Есть ли способ сделать это для describe()или context()?
Чови

1
@LeonAdler .timeoutтеперь включен в Мокко типизации DefinitelyTyped по адресу: Mocha.IRunnable. Однако, если вы используете IDE Webstorm для запуска этих тестов, обратите внимание: по какой-либо причине плагин интеграции Mocha WebStorm по-прежнему не распознает тесты Mocha с .timeout()добавленными (это означает, что рядом с ними нет кнопки «Выполнить»), и, таким образом, я рекомендую избегать использования стрелок, чтобы разрешить использование this.timeout()вместо них.
Джейми Берч

Это потрясающе. Для асинхронной функции, возвращающей обещание, вы можете оставить out done ().
Билловертон

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

РЕДАКТИРОВАТЬ: Почему это не удается:

Как @atoth упоминает в комментариях, функции жирной стрелки не имеют этой привязки. Таким образом, это не возможно для его функционирования , чтобы связываться с этим обратного вызова и обеспечить тайм - аут функции.

Итог : не используйте функции стрелок для функций, которые требуют увеличенного времени ожидания.


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
Это не совсем не имеет значения; часто имеет смысл заглушить сетевой ответ, чтобы вы не зависели от того, работает ли эта машина или возвращает правильный ответ. Если вы тестируете сам ответ, то да, вам все равно нужно это сделать.
конец

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 (4 с).

Примечание: 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.