node.js中的玩笑测试失败,显示匹配器错误

时间:2019-10-04 17:29:57

标签: node.js regex jestjs

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);
});

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的位置。