【问题标题】:How to spy on a function used in another function?如何监视另一个函数中使用的函数?
【发布时间】:2020-11-21 17:29:22
【问题描述】:
我有一个包含源代码foo.ts 的文件和一个名为foo.test.ts 的测试文件
foo.ts
function bar(argument: arg): boolean {
return true
}
async function foo(argument: arg) {
if (bar(argument)) {
await promiseRequest()
}
}
我试图以这样一种方式存根 bar(),当调用 foo(argument) 时,bar() 返回 false。
我浏览了Jest documentation 并尝试根据那里的方法实现,但是当我在foo.test.ts 文件中调用foo(argument) 时它们不起作用。
我该怎么做?
【问题讨论】:
标签:
typescript
testing
mocking
jestjs
stub
【解决方案1】:
不可能对在其定义的同一模块中使用的函数执行此操作,除非它是可以在对象上监视的方法。
foo 和bar 需要一起测试,或者他们应该被拆分到不同的模块并用jest.mock 模拟。
【解决方案2】:
您可以为此使用依赖注入。
foo.ts
function bar(argument: arg): boolean {
return true
}
async function foo(argument, bar = bar) {
if (bar(argument)) {
await promiseRequest()
}
}
export const Foo = {
bar,
foo
}
然后在您的测试文件中,您可以通过以下方式模拟/存根bar():
foo.test.ts
test('Test for foo()', () => {
const mockBar = jest.fn().mockReturnValue(value)
expect(Foo.foo(arg, mockBar)).toBe(expectation)
})