在 Jest/RTL 中模拟单个变量

时间:2021-07-12 09:49:53

标签: javascript jestjs

这感觉不像我做的那么难。这里以一个小(高度简化)函数为例:

dateCalculator.js

const today = new Date();
const deliveryDate = new Date();

deliveryDate.setDate(today.getDate() + 3);

export const dateCalculator = () => {
  return `${deliveryDate.toLocaleString('en-GB', { weekday: 'long' })}`;
};

所以这个函数获取今天的日期,加上三天,然后返回星期几。 Obvs,我要测试一下:

dateCalculator.spec.js

import { dateCalculator } from './dateCalculator';

describe('dateCalculator', () => {
  it('should return the correct day of the week', () => {
    expect(dateCalculator()).toBe('Thursday');
  });
});

此测试通过,但只有在星期一运行时才会通过。

如何强制变量 today 成为我可以通过测试控制的特定日期?我不知道如何模拟这个单一变量。

1 个答案:

答案 0 :(得分:1)

当然,这是我做错的事情;这确实有效:

dateCalculator.spec.js

  it('should return a date in the expected format', () => {
    const mockDate = new Date(1466424490000);
    const spy = jest.spyOn(global, 'Date').mockImplementation(() => mockDate);
    expect(dateCalculator()).toBe('Thursday');
    spy.mockRestore();
  });

它不起作用,因为我没有在 today 函数中实例化 dateCalculator。将所有内容都放在函数体中可以解决这个问题:

dateCalculator.js

export const dateCalculator = () => {
  const today = new Date();
  const deliveryDate = new Date();

  deliveryDate.setDate(today.getDate() + 3);

  return `${deliveryDate.toLocaleString('en-GB', { weekday: 'long' })}`;
};
相关问题