【问题标题】:Mocking a single variable in Jest/RTL在 Jest/RTL 中模拟单个变量
【发布时间】:2021-09-21 11:53:59
【问题描述】:

这感觉远没有我做的那么困难。这里有一个小(高度简化)的函数作为例子:

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 成为我可以从测试中控制的特定日期?我不知道如何模拟这个单一变量。

【问题讨论】:

  • 嗨,你试过这个吗? so answer
  • @sakisTsalk 我有,但不幸的是,我工作的组织是 25.5.4,这还不够新,无法支持... :(
  • 好吧,我仍然建议在该线程上查看其他答案。
  • 我实际上已经完成了 - 这是我在写问题之前发现的线程之一。虽然当我在测试中单独使用接受的答案时确实会产生影响,但它不会影响我正在寻求帮助的 deliveryDate.js 文件返回的内容。如何强制 today 变量成为我在测试文件中控制的日期?

标签: javascript jestjs


【解决方案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();
  });

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

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' })}`;
};

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 2022-08-17
    • 2021-10-09
    • 1970-01-01
    • 2021-07-06
    • 2020-11-01
    • 2019-11-13
    • 1970-01-01
    • 2018-12-15
    相关资源
    最近更新 更多