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

时间:2019-09-11 19:14:56

标签: javascript jestjs

我有一个功能:

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

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

如您所见,它几乎是一个执行一系列任务的void函数。 “ complexObj1”和“ complexObj2”对象及其附加的功能全部由我使用的API生成。

我要测试的东西:

  • 参数complexObj1和complexObj2是有效对象
  • 功能内的someObj是有效的对象,可能正在检查是否存在某个属性
  • objList返回有效列表
  • 循环中的每个obj是有效对象

测试这样的函数的正确方法是什么?我已经研究过Jest嘲笑,但是不确定是否适合我的情况。

  test("Test someFunction", () => {
    // not sure what to do here or what to mock etc
  });

我不能测试这样的功能吗?

如果有人能给我一个如何测试的例子,或者只是指出正确的方向,我将不胜感激。我真的很想学习如何做到这一点。

1 个答案:

答案 0 :(得分:1)

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

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

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!
})