Jest测试失败。匹配器错误:接收到的值必须具有length属性,其值必须为数字
Received has type: object
Received has value: {}
但是对象有一个值,但不是{}
index.js文件
const fs = require('fs');
select('company')
async function select(selector) {
await fs.readFile('./content.html', 'utf8', function (err, data) {
if (err) throw err;
regexForIds = new RegExp(/<([^\s]+).*?id="company".*?>(.+?)<\/\1>/gi);
matches = data.match(regexForIds);
const obj = {
length: matches.length
};
return obj
});
}
module.exports = select;
index.js文件
const select = require('./');
test('select supports ids', () => {
expect(select('#company')).toHaveLength(1);
});
答案 0 :(得分:0)
fs.readFile
不返回承诺,因此await fs.readFile
无法正常工作。
select
是一个异步函数,它不返回obj,因此expect(select('#company')).toHaveLength(1)
也将不起作用。
您可以通过将fs.readFile
和Promise一起包装来解决第一点(请注意,还有其他解决方法,例如使用promisify):
const fs = require("fs");
async function select(selector) {
const obj = await new Promise((res, rej) => {
fs.readFile("./content.html", "utf8", function(err, data) {
if (err) rej(err);
regexForIds = new RegExp(/<([^\s]+).*?id="company".*?>(.+?)<\/\1>/gi);
matches = data.match(regexForIds);
const obj = {
length: matches.length,
};
res(obj);
});
});
return obj;
}
module.exports = select;
要解决第二点,您需要稍微更改测试,方法是在调用await
之前添加select
:
const select = require("./");
test("select supports ids", async () => {
expect(await select("#company")).toHaveLength(1);
});
您可能必须根据运行测试的方式来更改./content.html
的位置。