Mocha / Chai测试不断产生错误“无法读取未定义的属性'length',”但是该函数可在应用程序本身中工作

时间:2019-05-28 20:27:03

标签: node.js mocha chai

问题摘要:

我编写了一个名为 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'”)。

我一直在研究此错误,还没有找到适合我的解决方案。预先感谢您的协助。

2 个答案:

答案 0 :(得分:0)

看看chai expect documentation,看起来数组期望值是通过以下语法进行管理的:

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

您可以试试吗?您可能需要更新到最新的chai版本。

答案 1 :(得分:0)

非常意外,但是问题实际上是我作为参数传递给函数的文件路径。路径是从文件系统中测试位置引用文件的,但是当我的同事建议在测试中执行 console.log(process.cwd()); 只是为了仔细检查(之后尝试其他似乎更明显的事情),我们发现该文件的行为好像在 root 而不是其子文件夹中。将path参数切换为从根目录而不是测试文件所在的子文件夹开始后,测试就可以正常运行。我仍然不明白为什么会出现这种情况,但这也许会在将来帮助其他人将自己的头撞向类似的 Mocha / Chai 神秘!

不起作用:

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