如何在testcafe中模拟Date()?

时间:2019-04-03 12:28:10

标签: date automated-tests e2e-testing web-testing testcafe

我的测试包括以下步骤:根据当前日期设置日期(使用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

2 个答案:

答案 0 :(得分:3)

一种解决方案是使用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' 

});

答案 1 :(得分:0)

万一这对其他人有用:上面的解决方案不适用于最新版本的testcafe(1.7.1)来模拟页面初始化日期(在调试中运行测试期间检查浏览器控制台时)模式下,日期可以很好地模拟,但似乎在页面加载时执行我的应用脚本的过程中没有模拟日期。

经过一番摸索,我想出了以下解决方案(也比上面的解决方案短了一点):

fixture `My Fixture`
  .clientScripts([{module: 'mockdate'}, {content: "MockDate.set('2000-11-22')"}]);

(我认为对于单个测试也应该有可能,但尚未进行测试。有关更多信息,请参见https://devexpress.github.io/testcafe/documentation/using-testcafe/common-concepts/inject-scripts-into-tested-pages.html。)