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()是一个模拟。此单元测试导入并测试realexportTableToCSV
函数,但它模拟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()是一个模拟。此单元测试导入并测试realexportTableToCSV
函数,但它模拟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
的函数定义,这些函数的定义方式决定了模拟它们的方式)