Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jest测试,在第一次调用时调用实际实现,模拟其余部分_Javascript_Node.js_Jestjs - Fatal编程技术网

Javascript 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实

我们正在将回购协议从sinon存根转移到jest,而我在这方面遇到了麻烦。我要做的是在第一次调用时调用实际实现,然后模拟其余调用。这个函数是递归的,所以我们希望第一个调用调用实际的实现,然后模拟递归调用

在西农,就是这样做的

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