Запустить пользовательский JavaScript в Chromium с CodeceptJS? - PullRequest
1 голос
/ 09 октября 2019

Мне нужно высказать время для моих тестов CodeceptJS.

Компонент My React использует функцию new Date():

const Component = () => {
    console.log(new Date())
    return <h1>Im a component</h1>
}

Мне нужно, чтобы компонент думал, что это 2018. Для моих юнит-тестов Jest это было просто:

import MockDate from 'mockdate';

MockDate.set('2018-10');

test("test something", ()=>{
    // Actual test here 
})

MockDate.reset(); 

Как я могу сделать то же самое с CodeceptJS? Я попробовал использовать модуль проверки даты в тесте:

Scenario('@test', async (CheckoutPage) => {
    const MockDate = require('mockdate');
    MockDate.set('2018-10');
     // Actual test here

});

Я также попробовал инъекцию зависимости. Код в обезьяне FIX-DATE исправляет дату:

Scenario(
  '@test',
  (CheckoutPage, FixDate) => {
    FixDate();
    CheckoutPage.load();
    pause();
  }
).injectDependencies({ FixDate: require('./FIX-DATE') });

Ни один из них не влияет на дату.

1 Ответ

1 голос
/ 15 октября 2019

Проблема в том, что CodeceptJS работает внутри браузера, поэтому вам необходимо переопределить объект даты браузера.

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

// create a date object for this Friday:
var d = new Date(2018, 0, 20);
//override Date constructor so all newly constructed dates return this Friday
Date = function(){return d;};

var now = new Date()
console.log(now);

Date.now = function () { return d};
console.log(Date.now());

Это способ сделать это в чистом JS, второй шаг - это интеграция в codeceptjs, и это можно сделать, используя I.executeScript

для примера:

  I.executeScript(function () {
    var d = new Date(2018, 0, 20);
    Date = function(){return d;};
  })

Вы также можете создать пользовательский шаг, например, I.fakeDate (new Date (2018, 0, 20))

    module.exports = function() {
      return actor({

        fakeDate: function(date) {

             I.executeScript(function (fakeDate) {
                 var d = fakeDate;
                 window.__original_date = Date;
                 Date = function(){return d;};
             }, date);
        },

        fakeDateRestore: function() {
            I.executeScript(function () {
                 Date = window.__original_date;
            });
        }

      });
    }

Тогда вы просто подделаете дату, когдавам нужно, и восстановите его.

I.Click('beofre');
I.fakeDate(new Date(2018,10,01));
// The test code here
I.fakeDateRestore();

Надеюсь, это поможет @ :-)

...