使用CodeceptJS在Chromium中运行自定义JavaScript吗?

时间:2019-10-09 17:58:19

标签: codeceptjs

我需要模拟CodeceptJS测试的时间。

我的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 个答案:

答案 0 :(得分:1)

问题在于CodeceptJS在浏览器内部运行,因此您需要覆盖浏览器的date对象。

基本上,您需要覆盖浏览器的Date对象或所使用的函数,例如:

// 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();

希望这对@ :-)有帮助