Как изменить тайм-аут в асинхронной спецификации jasmine-node

92

Как я могу пройти этот тест, не прибегая к блокам run / waitsFor?

it("cannot change timeout", function(done) {

     request("http://localhost:3000/hello", function(error, response, body){

         expect(body).toEqual("hello world");

         done();
     });
});
Брайан Лоу
источник

Ответы:

107

Вы можете (сейчас) установить его прямо в спецификации, как указано в документации Jasmine .

describe("long asynchronous specs", function() {

    var originalTimeout;

    beforeEach(function() {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
    });

    it("takes a long time", function(done) {
        setTimeout(function() {
            done();
        }, 9000);
    });

    afterEach(function() {
        jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
    });
});
Франциско
источник
Да, изменение jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;значения помогло мне в новой установке, созданной с нуля с использованием Jasmine + Jest. Работает как положено.
Игнасио Сегура
Я согласен с @willydee, были проблемы с запуском тестов с cloudinary, и этот небольшой фрагмент пришел мне на помощь.
Дев Йего
1
Возможно, стоит отметить, что это должно произойти до it. К тому времени, когда вы участвуете в тесте, doneкажется, что он уже подключился к тому, что DEFAULT_TIMEOUT_INTERVALбыло до itначала.
ruffin
81

Отправлен запрос на включение для этой функции ( https://github.com/mhevery/jasmine-node/pull/142 )

it("cannot change timeout", function(done) {

  request("http://localhost:3000/hello", function(error, response, body){

     expect(body).toEqual("hello world");

     done();
  });

}, 5000); // set timeout to 5 seconds
Брайан Лоу
источник
43

Чтобы установить глобальный тайм-аут Jasmine-Node, сделайте следующее:

jasmine.getEnv().defaultTimeoutInterval = timeoutYouWouldPrefer;// e.g. 15000 milliseconds

Благодарим разработчика Гейба Хикса за выяснение части .getEnv () через отладку, несмотря на дезинформацию в документе README, в котором утверждается, что это сделано путем установки jasmine.DEFAULT_TIMEOUT_INTERVAL.

Если вы хотите установить собственный тайм-аут только для одного it (), вы можете попробовать передать тайм-аут (миллисекунды) в качестве третьего аргумента (после строкового оператора и функции). Вот пример того, как это делается здесь , но я не уверен, что произошло бы, если бы пользовательский тайм-аут был больше, чем по умолчанию для Жасмин. Я думаю, это не удастся.

Колин Мэй
источник
29
Обновление для тех, кто наткнулся на этот ответ в 2014 году: для Jasmine 2 работает настройка jasmine.DEFAULT_TIMEOUT_INTERVAL.
Саймон Гроенвольт
2
У меня это работает на совершенно новой установке с использованием Jest + Jasmine. Я только что добавил jasmine.DEFAULT_TIMEOUT_INTERVAL = 12000;глобальный файл конфигурации, который использую для всех тестов, и он работает должным образом.
Игнасио Сегура,
23

Похоже, теперь вы можете добавить его в качестве последнего аргумента itфункции:

describe('my test', function(){
    it('works', function(done){
        somethingAsync().then(done);
    }, 10000); // changes to 10 seconds
});
г -_- б
источник
13

В Angular поместите это за пределы блока описания:

jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;

Это относится ко всем тестам в файле .spec.ts.

danday74
источник
3

Добавление: jasmine.DEFAULT_TIMEOUT_INTERVAL = yourTime;у меня работал над вспомогательным файлом.

Иван Рангель
источник
3

Поместите это после describeутверждения:

describe("A saves to DB", function() {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
Михал Кулински
источник
0

Почему не шпионить setTimeout()?

Что-то вроде:

var spy = spyOn(window, 'setTimeout').andCallFake(function (func, timeout) {
    expect(timeout).toEqual(2500);
    func();
});

setTimeOut(function () { ... }, 2500);
expect(spy).toHaveBeenCalled();
ггозад
источник
1
Благодарю. Это интеграционные тесты, node.js обращается к внешней службе, которая часто работает медленно.
Брайан Лоу
это замечательно, это позволяет проверить тайм-аут, не заставляя тест ждать фактического тайм-аута
Гийом
таким образом мы не тренируем течение времени и сразу вызываем fn, в то время как оригинал никогда не вызывает его до следующего цикла.
Андре Верланг,
0

В моем случае у меня было несколько тестовых случаев, и пока я использовал вышеупомянутое решение, я использовал:

    beforeEach(function() {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
    });

DEFAULT_TIMEOUT_INTERVAL не был обновлен в первом тестовом примере, поэтому мне пришлось добавить это:

  beforeAll(() => {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
  })

к моему коду, чтобы успешно запустить все тесты.

Андреас Фотеас
источник
0

Чтобы сделать это глобально для всех ваших тестов (в случае тестирования e2e или интеграции), вы можете использовать помощник.

При правильной настройке вспомогательный файл должен быть загружен до выполнения тестов и позволит вам изменить DEFAULT_TIMEOUT_INTERVAL глобально:

спецификация / поддержка / jasmine.json

{
    ...
    "helpers": [
        "/path/to/helpers/**/*.ts"
    ]
}

помощники / timeout.ts

jasmine.DEFAULT_TIMEOUT_INTERVAL = 300000;
bobbyg603
источник
-18

Измените j $ .DEFAULT_TIMEOUT_INTERVAL на 10000 в следующем файле: npm \ node_modules \ jasmine-core \ lib \ jasmine-core

Sharaj Rewoo
источник
Неэффективно для сценариев, в которых библиотеки устанавливаются каждый раз при запуске теста. Пример: - запуск CI on Cloud.
domino_katrino