Тестирование функции, которая использует setTimeout с Jest: почему этот тест не проходит?

Нет «320x240 glOrtho canvas». Фактическое разрешение окна: 960x720.

Все, что вы делаете, - это увеличение координат примитивов, которые вы визуализируете. Таким образом, ваш код говорит, чтобы сделать линию от, например, (20, 20) до (40, 40). И OpenGL (в конечном счете) масштабирует эти координаты на 3 в каждом измерении: (60, 60) и (120x120).

Но это касается только конечных точек . То, что происходит посередине, по-прежнему основывается на том факте, что вы выполняете рендеринг в фактическом разрешении окна.

Даже если вы использовали glLineWidth для изменения ширины ваших линий, это только исправило бы линию ширина. Это не повлияет на то, что растрирование линий основано на фактическом разрешении, которое вы выполняете. Таким образом, диагональные линии не будут иметь пикселированный вид, который вы, вероятно, захотите.

Единственный способ сделать это правильно - это правильно сделать это. Отобразите изображение, которое является фактическим 320x240, затем примените его к фактическому разрешению окна.

Вам нужно будет создать текстуру этого размера, а затем привязать его к объекту framebuffer . Привяжите FBO для рендеринга и рендеринга к нему (при этом размер окна просмотра установлен на размер изображения). Затем отвяжите FBO и нарисуйте эту текстуру в окне (с учетом окна просмотра).

2
задан Mark Bell 27 March 2019 в 06:41
поделиться

2 ответа

Вы должны использовать второй вызов для включения таймеров:

Подробнее здесь

test('rateLimit', () => {
  const action = jest.fn();

  const doAction = rateLimit(action, 100);

  doAction(); // This should increment the call count
  doAction(); // This shouldn't, because 100ms hasn't elapsed yet

  jest.runAllTimers();

  doAction(); // This should increment the count again

  jest.runAllTimers();

  expect(action).toHaveBeenCalledTimes(2);
});
0
ответ дан Smolin Pavel 27 March 2019 в 06:41
поделиться

Ваш ограничитель скорости использует метод trailing, в котором он отменяет любые текущие вызовы, когда поступают новые ... до тех пор, пока не истечет время ожидания, в этот момент вызывается функция.

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

jest.useFakeTimers();

test('rateLimit', () => {
    const action = jest.fn();

    const doAction = rateLimit(action, 100);

    doAction(); // This should increment the call count
    doAction(); // This shouldn't, because 100ms hasn't elapsed yet

    jest.advanceTimersByTime(101);

    doAction(); // This should increment the count again

    jest.advanceTimersByTime(101);  // <= advance the timers again

    expect(action).toHaveBeenCalledTimes(2);  // Success!
});
0
ответ дан brian-lives-outdoors 27 March 2019 в 06:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: