Javascript 在jest中为函数编写测试用例

Javascript 在jest中为函数编写测试用例,javascript,unit-testing,jestjs,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', () => { co

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

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);
它给了我一个错误,说它没有被调用。
有人能告诉我为上述函数编写测试用例的正确方法吗?我相信被调用的
exporttabletosv
不是真正的
exporttabletosv
,而是一个
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);
});
请注意:在上面的示例中,我没有模拟
exportTableToCSV
jest.fn()是一个模拟。此单元测试导入并测试real
exportTableToCSV
函数,但它模拟
encode()
downloadCsv()
。干杯

更新---

根据您的评论,您声明您看到了关于
createObjectURL
的错误,但这不在提供的示例代码中。显然,在您随
exportTableToCSV
导入的模块中存在一些有问题的代码。解决这一问题的正确方法是模拟并清除有问题的代码,但因为我想在这里提供一个自包含的解决方案,第二个最好的方法是模拟
exportTableToCSV
本身。在这种情况下,您将不测试原始函数,而只测试模拟函数。删除
import
语句,并在定义
downloadcv
之后,在测试用例的范围内添加以下内容:

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

我相信被调用的
exporttabletosv
不是真正的
exporttabletosv
,它是一个
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);
});
请注意:在上面的示例中,我没有模拟
exportTableToCSV
jest.fn()是一个模拟。此单元测试导入并测试real
exportTableToCSV
函数,但它模拟
encode()
downloadCsv()
。干杯

更新---

根据您的评论,您声明您看到了关于
createObjectURL
的错误,但这不在提供的示例代码中。显然,在您随
exportTableToCSV
导入的模块中存在一些有问题的代码。解决这一问题的正确方法是模拟并清除有问题的代码,但因为我想在这里提供一个自包含的解决方案,第二个最好的方法是模拟
exportTableToCSV
本身。在这种情况下,您将不测试原始函数,而只测试模拟函数。删除
import
语句,并在定义
downloadcv
之后,在测试用例的范围内添加以下内容:

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

您能指导我如何模拟函数吗?意思是如何模拟exportTableToCSV函数吗?用示例代码更新。另见。最美好的祝福!我添加了另一个细节以使其更加清晰:在上面的示例中,我没有模拟
exportTableToCSV
,但我会模拟从内部调用的其他函数。我同意!您可以为这些底层函数编写不同的测试。如果我的回答对你有帮助,那么请投票并接受。我理解你的想法。但是测试用例仍然给出了错误,因为typeError window.URL.createObjectURL不是一个函数。您可以指导我如何模拟函数吗?意思是如何模拟exportTableToCSV函数?使用示例代码更新。另见。最美好的祝福!我添加了另一个细节以使其更加清晰:在上面的示例中,我没有模拟
exportTableToCSV
,但我会模拟从内部调用的其他函数。我同意!您可以为这些底层函数编写不同的测试。如果我的回答对你有帮助,那么请投票并接受。我理解你的想法。但是测试用例仍然给出错误,因为typeError window.URL.createObjectURL不是函数请共享定义了
exportTableToCSV
的完整代码文件,谢谢。(或至少包括
encode
downloadcv
的函数定义,这些函数的定义方式决定了您如何模拟它们)请共享定义
exportTableToCSV
的完整代码文件,谢谢。(或至少包括
encode
downloadscsv
的函数定义,这些函数的定义方式决定了模拟它们的方式)