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

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

Я написал функцию с именем getImagePathsFromCatalog , которая принимает строку, представляющую местоположение файла каталога (XML). Он считывает информацию о продукте из файла каталога и создает массив «map» (*), состоящий из productIds (ключ), каждый из которых содержит массив связанных изображений (значение).

В моем приложении это работает нормально и всегда возвращает ожидаемый результат, который должен выглядеть примерно так (отформатирован для удобства чтения):

[ 
'TEST-123': [ 'products/TEST-123.jpg' ],
'TEST-12345': [ 'products/Equipment/TEST-12345.jpg',
              'products/Equipment/TEST-12345_1.jpg' ]
]

Справочная информация:

Я пытался использовать различный синтаксис для создания блока it (используя async / await , используя .then ); используя return и ожидаем ; использование различных методов Чай ( be , должен , заявить и т. д.); присвоение значения разрешения обещания let для использования в утверждении; используя готово ; и некоторые другие вещи, которые, я уверен, я забыл.

Я также пробовал разные ожидания, включая to.be.array , to.be.ok , to.exist и т. Д., Но все заканчивается одной и той же ошибкой.

Я установил и импортирую все необходимые библиотеки и функции: chai , chai-as-обещано , 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();
        });
    });
});

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Очень неожиданно, но проблема заключалась в пути к файлу, который я передавал в функцию в качестве аргумента.Путь ссылался на файл из местоположения теста в файловой системе, но когда мой коллега предложил сделать console.log (process.cwd ()); в тесте просто для двойной проверки (после попыткиМНОГО других вещей, которые казались более очевидными), мы обнаружили, что файл ведет себя так, как если бы он находился в корне root , а не в его подпапке.После переключения аргумента пути для запуска на корневом уровне, а не на подпапку, в которой находится тестовый файл, тесты начали работать отлично.Я до сих пор не понимаю почему это так, но, возможно, это поможет кому-то еще в будущем, кто бьет себя по голове похожим Мокко / Чай тайна!

Не работает:

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();
        });
    });
});
0 голосов
/ 29 мая 2019

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

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

Ты можешь попробовать это? Вам может потребоваться обновление до последней версии Chai.

...