我使用fs模块将html字符串导入到我的模块中,如下所示:
const fs = require('fs'); const htmlString = fs.readFileSync("../utils/htmlString.html").toString();
然后,在我的测试文件中,我试图像这样模拟fs模块:
const fs = require('fs'); jest.mock("fs", () => { return { readFileSync: jest.fn() fs.readFileSync.mockReturnValue("test string");
我可能错误的逻辑告诉我,它应该正确地模拟原始字符串导入,并将其替换为“测试字符串”字符串。但是,在运行测试时,它会抛出:
TypeError:无法读取未定义的属性“toString”
我理解这意味着模拟是不成功的,因为它应该成功地调用字符串实例上的.toString()。
我在这里做错了什么?
618夏日盛惠
2核2G云服务器首年95元,GPU云服务器低至9.93元/天,还有更多云产品低至0.1折…
您不需要显式地为 jest.mock('fs') 提供模块工厂参数。当需要时, jest.mock() 用自动模拟版本来模拟模块.这意味着 fs.readFileSync 是一个与 jest.fn() 相同的模拟方法。
jest.mock('fs')
jest.mock()
fs.readFileSync
jest.fn()
您需要确保在模拟返回值之后,需要测试的模块,因为模块作用域中的代码将在需要时立即执行。
例如。
index.js
const fs = require('fs'); const htmlString = fs.readFileSync('../utils/htmlString.html').toString(); console.log('htmlString: ', htmlString);
index.test.js
const fs = require('fs'); jest.mock('fs'); describe('70760704', () => { test('should pass', () => { expect(jest.isMockFunction(fs.readFileSync)).toBeTruthy(); fs.readFileSync.mockReturnValue('test string'); require('./'); });
测试结果:
PASS stackoverflow/70760704/index.test.js (7.242 s) 70760704 ✓ should pass (14 ms) console.log htmlString: test string at Object.<anonymous> (stackoverflow/70760704/index.js:3:9)