首页 > 解决方案 > 在 Jest/RTL 中模拟单个变量

问题描述

这感觉远没有我做的那么困难。这是一个小(高度简化)的功能作为示例:

日期计算器.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,我将对其进行测试:

日期计算器.spec.js

import { dateCalculator } from './dateCalculator';

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

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

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

标签: javascriptjestjs

解决方案


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

日期计算器.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();
  });

它不起作用,因为我没有todaydateCalculator函数中实例化。将所有内容放入函数体中可以解决此问题:

日期计算器.js

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

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

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

推荐阅读