Как мне издеваться над Date () в testcafe? - PullRequest
3 голосов
/ 03 апреля 2019

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

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


await t.eval( () => {
  const fixedDate = new Date(2010, 0, 1);
  Date = class extends Date {
    constructor() {
      super();
      return fixedDate;
    }
  };
});

Таким образом, testcafe не может дойти до eval (хотя работает в моем Chrome). Пока мне удалось переписать только Date.now() напрямую, но не конструктор.

Интересно, является ли подход к изменению Date с помощью eval верным подходом или есть какое-нибудь лучшее решение, как исправить текущий Date.

1 Ответ

3 голосов
/ 03 апреля 2019

Одним из решений является использование пакета mockdate:

1 °) npm install --save mockdate

2 °) настройте свой тест следующим образом;

import { ClientFunction } from 'testcafe';
import { readFileSync } from 'fs';
import { join } from 'path';

test('Test', async t => {
  const mockdateJS = readFileSync(join(process.cwd(), 'node_modules','mockdate','src','mockdate.js')).toString();
  const loadJsLib = ClientFunction((js) => {
        window.MockDate = new Function(js);
        window.MockDate();
  });
  const setDate = ClientFunction((date) => window.MockDate.set(date));
    await loadJsLib(mockdateJS); // dynamically load the mockdate lib in browser
    await setDate('2000-11-22'); // mock date in browser
    // now any code in the browser that does new Date() will get '2000-11-22' 

});
...