【发布时间】:2020-06-24 16:33:22
【问题描述】:
我看到过类似的问题,但我在文档或 stackoverflow 中没有看到任何描述我正在尝试做的事情。我是 javascript 新手,刚开始使用 jest,我已经阅读了 jest 文档,但我还没有看到模拟外部库的命名导出的示例。我试图模拟的库是速率限制器灵活的。我想模拟命名的导出 RateLimiterRedis。我需要模拟几个 RateLimiterRedis 函数,包括 get、consume 和 delete。
例如,当我从 redis 模拟一个函数时,我所要做的就是:
import redis from 'redis';
jest.mock('redis', () => {
return { createClient: jest.fn()};
});
当我尝试时:
jest.mock('rate-limiter-flexible', () => {
return jest.fn().mockImplementation(() => {
return { RateLimiterRedis: { get: mockGet } }
});
});
我得到:TypeError: _rateLimiterFlexible.RateLimiterRedis 不是构造函数
当我尝试时:
jest.mock('rate-limiter-flexible', () => {
return { RateLimiterRedis: () => {}}
});
我得到:TypeError:limiter.get 不是函数
所以它可以识别构造函数,但我需要添加函数。
我试过了:
jest.mock('rate-limiter-flexible', () => {
return { RateLimiterRedis: () => {
return jest.fn().mockImplementation(() => {
return {
get: mockGet
}
})
},
}
});
这也给出:TypeError:limiter.get is not a function
这是在我要测试的文件中:
const limiter = new RateLimiterRedis(opts);
我也尝试过 doMocking 命名的导出本身(因为模拟将自己提升到顶部)但没有成功
我的问题归结为,当该类是外部库的命名导出时,我如何模拟一个类的构造函数以及该类的函数?
编辑:
mockGets 定义:
const mockIpAndUrl ={
consumedPoints:1
};
const mockGet = jest.fn().mockImplementation(() => {
return mockIpAndUrl;
})
这不起作用:
const mockIpAndUrl ={
consumedPoints:1
};
const mockGet = jest.fn().mockImplementation(() => {
return mockIpAndUrl;
})
jest.mock('rate-limiter-flexible', () => {
return{
RateLimiterRedis: jest.fn().mockImplementation(() => {
return { get : mockGet};
})
}
});
TypeError:limiter.get 不是函数
但是,这样做:
jest.mock('rate-limiter-flexible', () => {
return{
RateLimiterRedis: jest.fn().mockImplementation(() => {
return { get : jest.fn().mockImplementation(() => {
return mockIpAndUrl;
})};
})
}
});
这让我相信我可以使用 mockGet
【问题讨论】:
标签: javascript unit-testing testing mocking jestjs