Краткое описание проблемы:
Я написал функцию получитьImagePathsFromCatalog, которая принимает строку, представляющую расположение файла каталога (XML). Он считывает информацию о продукте из файла каталога и создает массив «карта» (*), состоящий из идентификаторов продуктов (ключ), каждый из которых имеет массив связанных изображений (значение).
В моем приложении это работает нормально и всегда возвращает ожидаемый результат, который должен выглядеть примерно так (отформатирован для удобочитаемости):
[
'TEST-123': [ 'products/TEST-123.jpg' ],
'TEST-12345': [ 'products/Equipment/TEST-12345.jpg',
'products/Equipment/TEST-12345_1.jpg' ]
]
Справочная информация:
Я пробовал использовать различный синтаксис для построения блока it (используя асинхронно/ожидание, используя .тогда); используя вернуть и ожидать; используя различные методы Chai (быть, должен, утверждать и т. д.); присвоение значения разрешения обещания позволять для использования в утверждении; используя Готово; и некоторые другие вещи, которые я точно забыл.
Я также пробовал разные ожидания, включая быть.массивом, быть.ок, существовать и т. д., но все они заканчиваются одной и той же ошибкой.
Я установил и импортирую все необходимые библиотеки и функции: чай, Чай как обещано, чайные массивы, chai-asserttype, чай.ожидайте (и т. д.) и также "использую" их, как и в chai.use(chaiAsPromised) и т. д.
(*) Примечание. Из-за спецификаций проекта я должен использовать массив, который ведет себя более или менее как карта, а не использовать реальный объект карты. Я знаю, что это может вызвать проблемы с такими тестами, как быть.массивом, но это не должно мешать мне ожидать, что результат существует или возвращается ненулевым (по крайней мере, я так не думаю?).
Код:
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();
});
});
});
Сводка ожидаемых и фактических результатов:
Ожидаемый результат: некоторые тесты (даже просто базовые утверждения о существовании или ненулевом/ненеопределенном статусе результата) должны пройти.
Фактический результат: все тесты, написанные для этой функции, возвращают одну и ту же ошибку («невозможно прочитать свойство «длина» неопределенного»).
Я исследовал эту ошибку и еще не нашел решения, которое работает для меня. Заранее благодарим вас за любую помощь.
Глядя на чай expect
документация, похоже, что ожидания массива управляются с помощью следующего синтаксиса:
expect(foo).to.be.an('array');
Вы можете попробовать это? Возможно, вам потребуется обновиться до последней версии chai.
Очень неожиданно, но на самом деле проблема заключалась в пути к файлу, который я передал функции в качестве аргумента. Путь ссылался на файл из местоположения теста в файловой системе, но когда мой коллега предложил выполнить console.info(процесс.cwd()); в тесте просто для перепроверки (после перепробования МНОЖЕСТВА других вещей, которые казались более очевидными), мы обнаружили, что файл вел себя так, как будто он находился в корень, а не в его подпапке. После переключения аргумента пути для запуска с корневого уровня, а не с подпапки, в которой находится тестовый файл, тесты начали работать отлично. Я до сих пор не понимаю, Зачем это так, но, возможно, это поможет кому-то еще в будущем, кто будет биться головой о подобную загадку Мокко/Чай!
Не работает:
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();
});
});
});
Только что попробовал в своем коде... Та же ошибка :-/ Спасибо за предложение! Я думаю, что эта притворная структура «карты» расстраивает тест ... Если я найду способ заставить Mocha / Chai принять ее, я сообщу о решении.