Тест Mocha / Chai продолжает выдавать ошибку «невозможно прочитать свойство «длина» неопределенного», но функция работает в самом приложении

Краткое описание проблемы:

Я написал функцию получить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();
        });
    });
});

Сводка ожидаемых и фактических результатов:

Ожидаемый результат: некоторые тесты (даже просто базовые утверждения о существовании или ненулевом/ненеопределенном статусе результата) должны пройти.

Фактический результат: все тесты, написанные для этой функции, возвращают одну и ту же ошибку («невозможно прочитать свойство «длина» неопределенного»).

Я исследовал эту ошибку и еще не нашел решения, которое работает для меня. Заранее благодарим вас за любую помощь.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 142
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Глядя на чай expect документация, похоже, что ожидания массива управляются с помощью следующего синтаксиса:

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

Вы можете попробовать это? Возможно, вам потребуется обновиться до последней версии chai.

Только что попробовал в своем коде... Та же ошибка :-/ Спасибо за предложение! Я думаю, что эта притворная структура «карты» расстраивает тест ... Если я найду способ заставить Mocha / Chai принять ее, я сообщу о решении.

scoffin 29.05.2019 20:02
Ответ принят как подходящий

Очень неожиданно, но на самом деле проблема заключалась в пути к файлу, который я передал функции в качестве аргумента. Путь ссылался на файл из местоположения теста в файловой системе, но когда мой коллега предложил выполнить 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();
        });
    });
});

Другие вопросы по теме