我正在使用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
答案 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);
});
答案 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()