как издеваться над глобальным объектом в backstop.js / puppetter - PullRequest
0 голосов
/ 28 марта 2020

Таким образом, backstop. js предоставляет возможность запускать пользовательский сценарий для базового движка. Я использую кукловод в качестве движка, поэтому я пытаюсь смоделировать Date.now с помощью 'onReadyScript':

page.evaluate('window.Date.now = () => 0; Date.now = () => 0;');
...
page.addScriptTag({
  // btw `console.log` here is not executed, do I use it in wrong way?
  content: 'Date.now = () => 0;' 
});
...
page.evaluate(() => {
  window.Date.now = () => 0;
  Date.now = () => 0;
});

Последний, я думаю, изменяет дату в контексте узла, а не внутри кукловода, но в любом случае пытался это также хорошо.

Ничего не сработало, тестируемый скрипт по-прежнему выводит real Date.now. Также я проверил Переопределить дату браузера при помощи кукловода , но это не помогло мне.

Да, я знаю, что могу пропустить определенные селекторы, но это не всегда имеет смысл (подумайте о часах со стрелками).

1 Ответ

0 голосов
/ 28 марта 2020

После попытки onBeforeScript с evaluateOnNewDocument() у меня работает. Полный сценарий:

module.exports = async function (page, scenario) {
    if (!page.dateIsMocked) {
        page.dateIsMocked = true
        await page.evaluateOnNewDocument(() => {
            const referenceTime = '2010-05-05 10:10:10.000';
            const oldDate = Date;
            Date = function(...args) {
                if (args.length) {
                    return new oldDate(...args);
                } else {
                    return new oldDate(referenceTime);
                }
            }
            Date.now = function() {
                return new oldDate(referenceTime).valueOf();
            }
            Date.prototype = oldDate.prototype;
        })
    }
};

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

...