首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jest -模拟来自moment-timezone的属性和函数

Jest -模拟来自moment-timezone的属性和函数
EN

Stack Overflow用户
提问于 2018-10-20 05:21:33
回答 1查看 5.7K关注 0票数 4

我正在尝试使用jest模拟属性tz和一个函数,但我不知道如何同时模拟这两个东西:

如果运行如下命令:

代码语言:javascript
复制
jest.mock('moment-timezone', () => () => ({weekday: () => 5}))

jest.mock('moment-timezone', () => {
  return {
    tz: {

    }
  }
})

我可以模拟属性tz或指令moment()。我如何写一个mock来覆盖这段代码呢?

代码语言:javascript
复制
const moment = require('moment-timezone')

module.exports.send = () => {
  const now = moment()
  moment.tz.setDefault('America/Sao_Paulo')
  return now.weekday()
}

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-10-20 07:29:54

您可以利用jest.mock()的第二个参数,它允许您指定要在测试中使用的模拟模块的自定义实现。

在这个自定义实现中,您还可以定义一些方便的帮助器来模拟预期的实现值(例如weekday())。

代码语言:javascript
复制
// send-module.test.js

jest.mock('moment-timezone', () => {
    let weekday
    const moment = jest.fn(() => {
        return {
            weekday: jest.fn(() => weekday),
        }
    })
    moment.tz = {
        setDefault: jest.fn(),
    }
    // Helper for tests to set expected weekday value
    moment.__setWeekday = (value) => weekday = value
    return moment;
})

const sendModule = require('./send-module')

test('test', () => {
    require('moment-timezone').__setWeekday(3)
    expect(sendModule.send()).toBe(3)
})

请注意,如果被模拟的模块有一个巨大的API表面,那么手动为每个测试文件提供模拟可能会变得乏味和重复。要解决后一种情况,您可以考虑编写一些手动模拟以使其可重用(即使用__mocks__目录约定),并通过使用jest.genMockFromModule()进行补充。

The Jest documentation has some guidance about this.

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52900076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档