问题摘要:
我编写了一个名为 getImagePathsFromCatalog 的函数,该函数接受一个表示目录(XML)文件位置的字符串。它从目录文件中读取产品信息,并生成一个由productIds(键)组成的数组“ map”(*),每个数组都具有与其相关的图像(值)的数组。
在我的应用程序中,此程序运行良好,并且始终返回预期的输出,该输出应如下所示(为便于阅读而设置):
[
'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 ,应该,断言等);将承诺的解析值分配给 let 以便在断言中使用;使用完成;还有其他一些我肯定会忘记的事情。
我还尝试了不同的期望,包括 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();
});
});
});
预期结果和实际结果摘要:
预期结果:一些测试(甚至只是关于结果存在或非空/非不确定状态的基本断言)
实际结果:为此功能编写的所有测试均返回相同的错误(“无法读取未定义的属性'length'”)。
我一直在研究此错误,还没有找到适合我的解决方案。预先感谢您的协助。
答案 0 :(得分:0)
看看chai expect
documentation,看起来数组期望值是通过以下语法进行管理的:
expect(foo).to.be.an('array');
您可以试试吗?您可能需要更新到最新的chai版本。
答案 1 :(得分:0)
非常意外,但是问题实际上是我作为参数传递给函数的文件路径。路径是从文件系统中测试位置引用文件的,但是当我的同事建议在测试中执行 console.log(process.cwd()); 只是为了仔细检查(之后尝试其他似乎更明显的事情),我们发现该文件的行为好像在 root 而不是其子文件夹中。将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();
});
});
});