开玩笑地为一个函数编写测试用例

时间:2019-03-01 20:36:45

标签: javascript unit-testing jestjs

我正在尝试为以下功能编写单元测试用例:

export function exportTableToCSV(data, columns, filename) {
    const csv = encode(data, columns);
    downloadCsv(csv, filename);
}

这里是测试用例:

exportTableToCSV = jest.fn();
it('testing exportTableToCSV function', () => {
    const data = {
        "Linkname": "ATL-HOU",
        "Anode": "ATL:pos0/1",
        "Aloc": "ATL"
    }
    const columns = Object.keys(data);
    const filename = "data.csv";
    exportTableToCSV(data,columns,filename);
    expect(exportTableToCSV).toHaveBeenCalledWith(data,columns,filename);
}

这有效,但是在尝试添加时:

expect(encode).toHaveBeenCalledWith(data,columns);

给我一​​个错误,说它没有被调用。 有人可以指导我为上述功能编写测试用例的正确方法是什么

1 个答案:

答案 0 :(得分:0)

我相信被称为的exportTableToCSV不是真正的exportTableToCSV,而是jest.fn()。真实的exportTableToCSV将调用encode(),但是您在这里没有使用真实的encode()

我尝试的一种解决方案是导入真实的exportTableToCSV()并将encode()作为jest.fn()。然后,当您调用exportTableToCSV()时,期望encode()被调用,并且您将证明两者均已被调用。

这是一种方法:

import { exportTableToCSV } from './foo'

it('testing exportTableToCSV function', () => {
  const mockEncodeResult = 'i am a mock';
  const encode = jest.fn((data, columns) => mockEncodeResult);
  const downloadCsv = jest.fn((csv, filename) => {});

  const testData = {
    Linkname: 'ATL-HOU',
    Anode: 'ATL:pos0/1',
    Aloc: 'ATL',
  };

  const testColumns = Object.keys(testData);
  const testFilename = 'data.csv';

  exportTableToCSV(testData, testColumns, testFilename);

  expect(encode).toHaveBeenCalledWith(testData, testColumns);
  expect(downloadCsv).toHaveBeenCalledWith(mockEncodeResult, testFilename);
});

请注意:在上面的示例中,我没有嘲笑exportTableToCSVjest.fn()是一个模拟。该单元测试导入并测试了真实的exportTableToCSV函数,但是模拟了encode()downloadCsv()。干杯!

更新---

根据您的评论,您说您看到关于createObjectURL的错误,但这不在提供的示例代码中。显然,然后,您要与exportTableToCSV一起导入的模块中存在一些有问题的代码。解决此问题的正确方法是模拟并清除有问题的代码,但是由于我想在此处提供独立的解决方案,因此,第二好的方法是模拟exportTableToCSV本身。在这种情况下,您将不会测试原始功能,而只会测试模拟。删除import语句,并在downloadCsv定义之后的测试用例范围内添加以下内容:

const exportTableToCSV = jest.fn((data, columns, filename) => {
  const csv = encode(data, columns);
  downloadCsv(csv, filename);
});