Javascript 如何测试使用外部API中复杂对象的函数?

Javascript 如何测试使用外部API中复杂对象的函数?,javascript,jestjs,Javascript,Jestjs,我有一个功能: // helper.js export const someFunction = (complexObj1, complexObj2) => { const someObj = complexObj1.generateAnObject(); const objList = someObj.generateListOfObjects(); for (const obj of objList) { obj.performAction(); } };

我有一个功能:

// helper.js
export const someFunction = (complexObj1, complexObj2) => {
  const someObj = complexObj1.generateAnObject();
  const objList = someObj.generateListOfObjects();

  for (const obj of objList) {
    obj.performAction();
  }
};
正如你所看到的,它是一个执行大量任务的空函数。“complexObj1”和“complexObj2”对象及其附带的函数都是从我正在使用的API生成的

我想测试的东西:

  • 参数complexObj1和complexObj2是有效的对象
  • Function中的someObj是一个有效对象,可能会检查某个属性是否存在
  • objList返回一个有效的列表
  • 循环中的每个对象都是有效对象
测试这样一个函数的正确方法是什么?我已经研究过嘲弄,但我不确定这是否符合我的设想

  test("Test someFunction", () => {
    // not sure what to do here or what to mock etc
  });
我不能像这样测试函数吗


如果有人能给我举个例子,告诉我如何测试这一点,甚至能给我指出正确的方向,我将不胜感激。我真的很想学习如何执行此操作。

看起来函数接受一个对象,调用该对象上的函数以生成不同的对象,调用该对象上的函数以生成数组,然后对数组中的每个对象调用函数

由于它只知道传递给它的内容,因此可以传递适当的模拟数据并使用来确认它是否正常工作:

const someFunction = (complexObj1) => {
  const someObj = complexObj1.generateAnObject();
  const objList = someObj.generateListOfObjects();

  for (const obj of objList) {
    obj.performAction();
  }
};

test('someFunction', () => {
  const objList = [
    { performAction: jest.fn() },
    { performAction: jest.fn() }
  ];
  const obj = {
    generateAnObject: () => ({
      generateListOfObjects: () => objList
    })
  };
  someFunction(obj);
  expect(objList[0].performAction).toHaveBeenCalled();  // Success!
  expect(objList[1].performAction).toHaveBeenCalled();  // Success!
})

您所说的要测试的内容都不是您所展示的功能的责任。该函数的行为是什么?空测试函数不是合法的尝试。@jonrsharpe hey感谢您的响应。我想我只是想确保一切都正常运行,因为这将是一个由相当多的用户使用的产品。如果这个函数实际返回一个对象,那么我要测试的唯一场景就是确保返回的对象是有效的吗?否则,如果函数没有返回任何内容,那么就没有要测试的内容了?这是正确的吗?“如果函数没有返回任何东西,那么就没有什么需要测试的了?”-那么它的副作用呢?如果它不返回任何内容或以其他方式执行任何操作,那么就没有什么可测试的,但它存在的意义是什么。@jonrsharpe此函数的重点是执行一些必要的操作,并真正为组织服务。但是,嗯,我想我可以在这个功能之外测试你提到的副作用。。好吧,至少你在引导我朝着我想要的方向前进,所以谢谢你。谢谢你抽出时间回答问题,而不是投反对票。这是完美的,引导我走向我所寻找的方向。多谢各位