在Jest中模拟对象的函数

pftdvrlh  于 2022-12-08  发布在  Jest
关注(0)|答案(1)|浏览(174)

我有一个函数的方法签名

//1 const changeFuncInObj = (myObj, someBool) => {
//2    myObj.anObjFunction = (event) => {
//3        return externalFunction(event.data) && someBool
//4    }
//5 }

我想测试此函数,但由于不正确的模拟,我无法进入第3行
我的测试文件如下:

test('test function inside object', () => {
          const myObj = {
            anObjFunction: jest.fn().mockImplementation(() => {
                return {
                    externalFunction: jest
                        .fn()
                        .mockReturnValueOnce(true),
                }
            }),
        }
        let result = changeFuncInObj(myObj, true)
     
        expect(result).toEqual(undefined) // should be true or false based on `externalFunction` and `someBool`
})

是否有一种方法可以模拟对象的所有可能的内部函数、布尔变量和内部函数值?

f3temu5u

f3temu5u1#

changeFuncInObj中,您将myObj的方法anObjFunction重新分配给其他函数。
这是对您所拥有的代码的测试:

const myObj = {
  anObjFunction: undefined,
};

expect(myObj.anObjFunction).not.toBeDefined();
changeFuncInObj(myObj, true);
expect(myObj.anObjFunction).toBeDefined();

函数changeFuncInObj不返回任何内容,因此结果将始终为undefined
如果externalFunction看起来像这样,测试可以像这样:

const externalFunction = (data) => data;

test("should work", () => {
  const myObj = {
    anObjFunction: undefined,
  };

  changeFuncInObj(myObj, true);

  expect(myObj.anObjFunction({ data: true })).toEqual(true);
  expect(myObj.anObjFunction({ data: false })).toEqual(false);

  changeFuncInObj(myObj, false);
  expect(myObj.anObjFunction({ data: true })).toEqual(false);
  expect(myObj.anObjFunction({ data: false })).toEqual(false);
});

相关问题