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);使用 returnexpect;使用各种 Chai 方法(beshouldassert 等);将承诺的解析值分配给 let 以用于断言;使用 完成;还有一些我确定我忘记的事情。

我也尝试过不同的期望,包括to.be.arrayto.be.ok to.exist,等等,但都以同样的错误结束。

我已经安装并正在导入所有必需的库和函数:chaichai-as-promisedchai-arrayschai-asserttypechai.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();
        });
    });
});