摩卡/柴测试不断产生错误"cannot read property 'length' of undefined,"但该功能在应用程序本身中工作



问题摘要:

我编写了一个名为getImagePathsFromCatalog的函数,该函数采用表示目录(XML)文件位置的字符串。它从目录文件中读取产品信息,并生成一个由 productId(键)组成的数组"map"(*),每个数组都有一个关联图像(值)的数组。

在我的应用程序中,这运行良好并始终返回预期的输出,该输出应如下所示(格式化为可读性):

[ 
'TEST-123': [ 'products/TEST-123.jpg' ],
'TEST-12345': [ 'products/Equipment/TEST-12345.jpg',
'products/Equipment/TEST-12345_1.jpg' ]
]

背景信息:

我尝试使用各种语法来构造它块(使用async/await,使用.then);使用返回期望;使用各种Chai方法(be,should,assert等);将promise的solve值分配给let以用于断言;使用done;以及其他一些我确定我忘记的事情。

我也尝试了不同的期望,包括to.be.array,to.be.ok,to.exist等,但都以相同的错误告终。

我已经安装并正在导入所有必需的库和函数:chai,chai-as-promised,chai-arrays,chai-asserttype,chai.expect(等),并且还在"使用"它们,如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();
});
});
});

预期和实际结果摘要:

预期结果:一些测试(甚至只是关于结果的存在或非空/未定义状态的基本断言)应该通过。

实际结果:为此函数编写的所有测试都返回相同的错误("无法读取未定义的属性'长度'")。

我一直在研究这个错误,但还没有找到适合我的解决方案。提前感谢您的任何帮助。

查看 chaiexpect文档,似乎数组期望是通过以下语法管理的:

expect(foo).to.be.an('array');

你能试试这个吗?您可能需要更新到最新的柴版本。

非常出乎意料,但问题实际上是我作为参数传递到函数中的文件路径。路径是从文件系统中的测试位置引用文件,但是当我的同事建议做一个控制台.log(process.cwd())时;在测试中只是为了仔细检查(在尝试了很多其他看起来更明显的事情之后),我们发现文件的行为就好像它在目录中而不是在其子文件夹中一样。将 path 参数切换为从根级别而不是测试文件所在的子文件夹开始后,测试开始完美运行。我仍然不明白为什么会这样,但也许这会帮助将来的其他人,他们正在与类似的摩卡/之谜相撞!

不起作用:

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

相关内容

最新更新