Javascript Jest测试,在第一次调用时调用实际实现,模拟其余部分
我们正在将回购协议从sinon存根转移到jest,而我在这方面遇到了麻烦。我要做的是在第一次调用时调用实际实现,然后模拟其余调用。这个函数是递归的,所以我们希望第一个调用调用实际的实现,然后模拟递归调用 在西农,就是这样做的Javascript Jest测试,在第一次调用时调用实际实现,模拟其余部分,javascript,node.js,jestjs,Javascript,Node.js,Jestjs,我们正在将回购协议从sinon存根转移到jest,而我在这方面遇到了麻烦。我要做的是在第一次调用时调用实际实现,然后模拟其余调用。这个函数是递归的,所以我们希望第一个调用调用实际的实现,然后模拟递归调用 在西农,就是这样做的 constub=sandbox.stub(实例'function'); 树桩 .onFirstCall() .callsFake(stub.wrappedMethod) .callsFake((args)=>args); 我想做类似的事情,但在jest spy或mock实
constub=sandbox.stub(实例'function');
树桩
.onFirstCall()
.callsFake(stub.wrappedMethod)
.callsFake((args)=>args);
我想做类似的事情,但在jest spy或mock实例上找不到实际的实现。难道这根本不可能吗
constspy=jest.spyOn(实例,'function');
间谍
.mockImplementationOnce(spy.mock.actual)/???
.mockImplementation((args)=>args);
为什么您不能做如下类似的事情
const spy = jest.spyOn(instance, 'function');
spy
.mockImplementationOnce(() => originalInstanceFunction())
.mockImplementation((args) => args);
下面是一个示例实现-注意必须存储对原始实例函数的引用
const original = {
func: (args) => { console.log(`original ${args}`)}
};
describe('test', () => {
it('should call original then mock', () => {
const originalFunction = original.func;
const spy = jest.spyOn(original, 'func');
spy.mockImplementationOnce((args) => originalFunction(args))
.mockImplementation((args) => console.log(`mock ${args}`));
original.func('test-args');
original.func('test-args');
expect(spy).toBeCalledTimes(2);
});
});
输出:
console.log
original test-args
at originalFunction (test.test.js:2:28)
console.log
mock test-args
at Object.spy.mockImplementationOnce.mockImplementation.args (test.test.js:12:42)
要对模拟库执行此操作,请使用
jest.requireActual()
。从以下位置复制示例:
这允许您在测试代码中模拟
fetch
库,但在测试本身中使用真正的fetch
函数。您能提供一些上下文吗?为什么第一次调用要通过?函数是递归的,所以我们想测试递归调用的调用计数。为什么?它的递归性不是一个实现细节吗?调用方关心吗?我想这可能是一个糟糕的测试,但我现在的目标是让事情在jest上运行。迁移不是摆脱糟糕测试的理想时间,而不是花时间迁移它们吗?第一个示例不起作用吗,因为instance.function
是间谍吗?如果是这样的话,就没有什么意义了,你当然不应该没有这个警告。have edited-不是作为一个工作示例,工作示例就是示例实现。
jest.mock('node-fetch');
const fetch = jest.requireActual('node-fetch');