Mocha/Chai 测试不断产生错误 "cannot read property 'length' of undefined," 但该功能在应用程序本身中有效
Mocha/Chai test keeps producing error "cannot read property 'length' of undefined," but the function works in the app itself
问题总结:
我编写了一个名为 getImagePathsFromCatalog 的函数,它采用表示目录 (XML) 文件位置的字符串。它从目录文件中读取产品信息并生成一个数组 "map"(*),其中包含 productIds(键),每个数组都有其相关图像(值)。
在我的应用程序中,它运行良好并且始终 return 是预期的输出,它应该看起来像这样(为了便于阅读而格式化):
[
'TEST-123': [ 'products/TEST-123.jpg' ],
'TEST-12345': [ 'products/Equipment/TEST-12345.jpg',
'products/Equipment/TEST-12345_1.jpg' ]
]
背景信息:
我尝试过使用各种语法来构造 it 块(使用 async/await,使用 .then);使用 return 和 expect;使用各种 Chai 方法(be、should、assert 等);将承诺的解析值分配给 let 以用于断言;使用 完成;还有一些我确定我忘记的事情。
我也尝试过不同的期望,包括to.be.array、to.be.ok、 to.exist,等等,但都以同样的错误结束。
我已经安装并正在导入所有必需的库和函数:chai、chai-as-promised、chai-arrays、chai-asserttype、chai.expect(等等)我也是"using" 它们,如 chai.use(chaiAsPromised) 等
(*) 注意:由于项目规范,我不得不使用一个行为或多或少像地图的数组,而不是使用实际的地图对象。我知道这可能会导致 to.be.array 等测试出现问题,但它不应该阻止我期待结果存在或返回非空(至少我不会不觉得会吗?。)
代码:
describe('catalogImages.getImagePathsFromCatalog(catalogFile)', function () {
it('function should return an array', function() {
catalogImages.getImagePathsFromCatalog('../imports/catalog.xml')
.then(catalogImagePathsMap => {
return expect(catalogImagePathsMap).to.be.array();
});
});
});
预期和实际结果汇总:
预期结果:一些测试(甚至只是关于结果存在或 non-null/non-undefined 状态的基本断言)应该通过。
实际结果:为此函数编写的所有测试return同样的错误("cannot read property 'length' of undefined")。
我一直在研究这个错误,但还没有找到适合我的解决方案。提前感谢您的帮助。
查看 chai expect
documentation,数组期望值似乎是通过以下语法管理的:
expect(foo).to.be.an('array');
你能试试这个吗?您可能需要更新到最新的 chai 版本。
非常意外,但问题实际上是文件路径我是 passing-into 作为参数的函数。该路径引用文件系统中测试位置的文件,但是当我的同事建议在测试中执行 console.log(process.cwd());只是为了 double-check(在尝试了很多其他看起来更明显的东西之后),我们发现该文件的行为就好像它在 root 而不是在它的子文件夹中.将路径参数切换为从根级别而不是测试文件所在的子文件夹开始后,测试开始完美运行。我仍然不明白 为什么 是这种情况,但也许这会帮助将来遇到类似 Mocha[=25= 的其他人]/柴谜底!
无效:
describe('catalogImages.getImagePathsFromCatalog(catalogFile)', function () {
it('function should return an array', function() {
catalogImages.getImagePathsFromCatalog('../imports/catalog.xml')
.then(catalogImagePathsMap => {
return expect(catalogImagePathsMap).to.be.array();
});
});
});
有效:
describe('catalogImages.getImagePathsFromCatalog(catalogFile)', function () {
it('function should return an array', function() {
catalogImages.getImagePathsFromCatalog('./imports/catalog.xml')
.then(catalogImagePathsMap => {
return expect(catalogImagePathsMap).to.be.array();
});
});
});
问题总结:
我编写了一个名为 getImagePathsFromCatalog 的函数,它采用表示目录 (XML) 文件位置的字符串。它从目录文件中读取产品信息并生成一个数组 "map"(*),其中包含 productIds(键),每个数组都有其相关图像(值)。
在我的应用程序中,它运行良好并且始终 return 是预期的输出,它应该看起来像这样(为了便于阅读而格式化):
[
'TEST-123': [ 'products/TEST-123.jpg' ],
'TEST-12345': [ 'products/Equipment/TEST-12345.jpg',
'products/Equipment/TEST-12345_1.jpg' ]
]
背景信息:
我尝试过使用各种语法来构造 it 块(使用 async/await,使用 .then);使用 return 和 expect;使用各种 Chai 方法(be、should、assert 等);将承诺的解析值分配给 let 以用于断言;使用 完成;还有一些我确定我忘记的事情。
我也尝试过不同的期望,包括to.be.array、to.be.ok、 to.exist,等等,但都以同样的错误结束。
我已经安装并正在导入所有必需的库和函数:chai、chai-as-promised、chai-arrays、chai-asserttype、chai.expect(等等)我也是"using" 它们,如 chai.use(chaiAsPromised) 等
(*) 注意:由于项目规范,我不得不使用一个行为或多或少像地图的数组,而不是使用实际的地图对象。我知道这可能会导致 to.be.array 等测试出现问题,但它不应该阻止我期待结果存在或返回非空(至少我不会不觉得会吗?。)
代码:
describe('catalogImages.getImagePathsFromCatalog(catalogFile)', function () {
it('function should return an array', function() {
catalogImages.getImagePathsFromCatalog('../imports/catalog.xml')
.then(catalogImagePathsMap => {
return expect(catalogImagePathsMap).to.be.array();
});
});
});
预期和实际结果汇总:
预期结果:一些测试(甚至只是关于结果存在或 non-null/non-undefined 状态的基本断言)应该通过。
实际结果:为此函数编写的所有测试return同样的错误("cannot read property 'length' of undefined")。
我一直在研究这个错误,但还没有找到适合我的解决方案。提前感谢您的帮助。
查看 chai expect
documentation,数组期望值似乎是通过以下语法管理的:
expect(foo).to.be.an('array');
你能试试这个吗?您可能需要更新到最新的 chai 版本。
非常意外,但问题实际上是文件路径我是 passing-into 作为参数的函数。该路径引用文件系统中测试位置的文件,但是当我的同事建议在测试中执行 console.log(process.cwd());只是为了 double-check(在尝试了很多其他看起来更明显的东西之后),我们发现该文件的行为就好像它在 root 而不是在它的子文件夹中.将路径参数切换为从根级别而不是测试文件所在的子文件夹开始后,测试开始完美运行。我仍然不明白 为什么 是这种情况,但也许这会帮助将来遇到类似 Mocha[=25= 的其他人]/柴谜底!
无效:
describe('catalogImages.getImagePathsFromCatalog(catalogFile)', function () {
it('function should return an array', function() {
catalogImages.getImagePathsFromCatalog('../imports/catalog.xml')
.then(catalogImagePathsMap => {
return expect(catalogImagePathsMap).to.be.array();
});
});
});
有效:
describe('catalogImages.getImagePathsFromCatalog(catalogFile)', function () {
it('function should return an array', function() {
catalogImages.getImagePathsFromCatalog('./imports/catalog.xml')
.then(catalogImagePathsMap => {
return expect(catalogImagePathsMap).to.be.array();
});
});
});