sinonjs - перевести часы на 59 минут и подождать 1 минуту - PullRequest
0 голосов
/ 01 июня 2018

У меня есть веб-компонент для функции автоматического выхода из системы, который показывает модальное окно с сообщением на 59-й минуте и останавливается еще на одну минуту в случае отсутствия активности.И выходит из системы, если пользователь нигде не щелкает в окне.Таким образом, никакая активность в течение часа не приведет к автоматическому выходу пользователя из системы.Это прекрасно работает.

Теперь, чтобы проверить эту функциональность, я попытался использовать sinonjs.Я использовал FakeTimers, но не смог достичь результата.Я пытаюсь протестировать это модальное окно с сообщением.

Вот код:

const { When } = require('cucumber'); // eslint-disable-line import/no-extraneous-dependencies
const fs = require('fs');
const path = require('path');

let clock;    

async function setupSinon() {
  const sinonPath = require.resolve('sinon');

  const content = await new Promise((resolve, reject) => {
    fs.readFile(
      path.join(sinonPath, '../../pkg/sinon.js'),
      'utf-8',
      async (error, cont) => {
        if (error) return reject(error);
        resolve(cont);
      },
    );
  });
  // creating <script> element for sinonjs to execute on the page
  await browser.execute((content) => {
    const script = document.createElement('script');
    script.type = 'text/javascript';
    script.text = content;
    document.head.appendChild(script);
  }, content);
}

async function iWaitForNMinutes() {
  await setupSinon();
  await browser.execute(() => {
    before(() => {
      clock = sinon.useFakeTimers();
    });
    clock = sinon.useFakeTimers({
      now: Date.now(),
      shouldAdvanceTime: true,
      toFake: ['setTimeout'],
    });

    clock.tick('59:00'); // advancing the clock to 59 minutes so that auto-logout modal window popup, but this doesn't work

    after(() => {
      clock.restore();
    });

    setTimeout(() => {}, 60000);

  });
} 

When(/^I wait for minutes$/, iWaitForNMinutes);

module.exports = {      
  iWaitForNMinutes,
};

sinon 5.0.10

Как пользователю sinonjsFakeTimer, чтобы увеличить время на n минут, а затем ждать фактически n минут?

Ответы [ 2 ]

0 голосов
/ 07 июля 2018

Ваша общая проблема, вероятно, в await перед вашей функцией (browser.execute):

  • продвижение часов до ждать бессмысленно (относительно чего-то вроде setTimeOut внутри) ... поскольку ни одна из этих внутренних функций синхронизации еще не настроена.
  • продвижение часов после , await <function> бессмысленно, потому что действительно, await будет ждать ...

Решение состоит в том, чтобы не использовать await с вашей (асинхронной) функцией, но обрабатывать ее как любую другую функцию, возвращающую обещание (какой на самом деле является любая асинхронная функция).

it('some test', async () => {

    await new Promise((resolve, reject) => {

        // normally used with await
        functionToBeTested(...some params).then(
            (value) => {
                log('now it happend')
                resolve()
            },
            (reason) => {
                reject(reason)
            }
        )

        // by not using await (despite deleteAction being an sync function)
        // but rather just chaining a then, this clock.tick gets run while
        // deleteAction is "running" resp. waiting for some timeout:
        clock.tick(1000)
    })

    ... some more asserts on the result...
    (we can be rest-assured the command under test is completed here)
})
0 голосов
/ 03 июня 2018

С поддельными таймерами Sinon довольно легко работать, и они являются моей любимой особенностью Sinon.

Использование идет следующим образом

В вашем коде

// in your code
eatCake() {
  setTimeout(function() {
    // eat cake after 10s
  }, 10000); // 10000 === 10s
}

В вашем тесте

clock = sinon.useFakeTimers();
clock.tick(9000);
// check if cake is eaten - answer will be false
clock.tick(1000); // 9000 + 1000 === 10s
// check if cake is eaten - answer will be true

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

В вашем случае, чтобы ждать 59 минут,Вы можете написать

clock.tick(1000 * 60 * 59); // 59 minutes

// check if the modal has opened up

clock.tick(1000 * 60 * 1); // 1 minute

// check if the user is logged out

И не забудьте восстановить часы в конце, как вы уже сделали.

clock.restore();
...