我正在尝试为以下功能编写单元测试用例:
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);
给我一个错误,说它没有被调用。 有人可以指导我为上述功能编写测试用例的正确方法是什么
答案 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);
});
请注意:在上面的示例中,我没有嘲笑exportTableToCSV
。 jest.fn()
是一个模拟。该单元测试导入并测试了真实的exportTableToCSV
函数,但是模拟了encode()
和downloadCsv()
。干杯!
更新---
根据您的评论,您说您看到关于createObjectURL
的错误,但这不在提供的示例代码中。显然,然后,您要与exportTableToCSV
一起导入的模块中存在一些有问题的代码。解决此问题的正确方法是模拟并清除有问题的代码,但是由于我想在此处提供独立的解决方案,因此,第二好的方法是模拟exportTableToCSV
本身。在这种情况下,您将不会测试原始功能,而只会测试模拟。删除import
语句,并在downloadCsv
定义之后的测试用例范围内添加以下内容:
const exportTableToCSV = jest.fn((data, columns, filename) => {
const csv = encode(data, columns);
downloadCsv(csv, filename);
});