我使用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()。
我在这里做错了什么?
发布于 2022-01-19 02:53:18
您不需要显式地为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)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 7.279 s, estimated 8 s
jest.config.js
module.exports = {
testEnvironment: 'node',
};
包版本:
"jest": "^26.6.3"
https://stackoverflow.com/questions/70760704
复制相似问题