在Node js / Mochausing要求模块中动态加载json文件内容,以动态传递文件名

时间:2019-01-22 21:31:17

标签: javascript node.js

我正在使用mocha / node js / cypress工具编写测试脚本,并能够使用以下语句加载json文件的数据:

var data = require('../../fixtures/TestData/JsonData/ABC_DEF.json');

如果我必须按如下所示在脚本中动态传递文件名-ABC_DEF.json,则该文件不起作用。

var filename = 'ABC_DEF.json'
var data = require('../../fixtures/TestData/JsonData/'+filename);

我在赛普拉斯控制台中看到的错误是:

  

未捕获的错误:找不到模块'../../ fixtures / TestData / JsonData / ABC_DEF.json'

高度赞赏任何投入。

注意:目标是读取文件名是动态变量的文件内容,并使用其值来动态构建测试名称-it()。因此,文件必须在describe块内部读取,因为它的优先级高于before()it()块。因此,无法使用cy命令,因为它们不会在外部测试中运行,而fs则只能在节点上下文中运行,因此无法使用,这再次只能通过cy.task

3 个答案:

答案 0 :(得分:1)

require命令用于加载Node.js模块,而不用于从文件读取数据。您可以使用require 将文件读取为对象,但这不是标准做法。

如果要从文件读取数据,请考虑使用fs模块:

var fs = require('fs');
var data = fs.readFileSync('../../fixtures/TestData/JsonData/ABC_DEF.json', 'utf8');
console.log(data);

编辑:如果您使用的是赛普拉斯:

cy.readFile('../../fixtures/TestData/JsonData/ABC_DEF.json').then((data) => {
    console.log(data);
});

https://docs.cypress.io/api/commands/readfile.html#Syntax

答案 1 :(得分:1)

我会向readFileSync添加一种编码,如下所示:

var fs = require('fs');
var data = fs.readFileSync('../../fixtures/TestData/JsonData/ABC_DEF.json', {encoding: 'utf-8'});
console.log(data);

如果要字符串而不是Buffer。如果您希望将其设为Object,则可以使用JSON.parse(data)将其放入对象。

我只是在命令行中执行此操作,并且我有一个test.json文件:

> fs.readFileSync('test.json');
<Buffer 7b 0d 0a 09 22 74 65 73 74 22 3a 20 31 0d 0a 7d>
> fs.readFileSync('test.json', {encoding: 'utf-8'})
'{\r\n\t"test": 1\r\n}'
> JSON.parse(fs.readFileSync('test.json', {encoding: 'utf-8'}))
{ test: 1 }

答案 2 :(得分:0)

无法通过文件的动态名称读取文件,无法使用其内容来构造测试名称-在同一spec文件中动态地创建测试名称(it())。解决方法:将代码拆分为2个不同的规范文件。第一个带有it()的文件,可使用cy命令通过文件名读取文件并将其文件内容保存在磁盘上。读取保存的文件内容并使用其值构造测试名称的第二个文件-it()