Почему использование Mongo в тестах пакетов не работает, если в пакете есть api.use('mongo')?

Я разрабатываю индивидуальный пакет. Его package.js:

Package.describe({
  name: 'adigiovanni:one-way-accounts',
  version: '0.0.1',
  summary: 'One Way Accounts',
  git: '',
  documentation: 'README.md',
});

Package.onUse(function (api) {
  api.versionsFrom('1.2.0.2');
  api.use('ecmascript');
  api.use('mongo');
  // api.imply('mongo');
  api.addFiles([
    'lib/collections/Accounts.js',
    'lib/methods.js',
    'lib/OneWayAccounts.js',
  ]);
  api.export('OneWayAccounts');
});

Package.onTest(function (api) {
  api.use([
    'ecmascript',
    'sanjo:[email protected]',
    'velocity:html-reporter',
  ]);
  api.use('adigiovanni:one-way-accounts');
  api.addFiles('tests/client/OneWayAccounts.js', 'client');
  api.addFiles('tests/server/OneWayAccounts.js', 'server');
});

Как видите, package использует 'mongo'.

Тесты терпят неудачу с:

Справочная ошибка: Mongo не определен

Но если я раскомментирую строку api.imply('mongo'), то тесты пройдут успешно.

Такое же странное поведение относится к зависимости ecmascript, если я не api.use('ecmascript') в Package.onTest, тесты не пройдут.

Версия Meteor — 1.2.0.2.
Тестовый запуск — это скорость.
Тестовая среда — jasmine.
В своих тестах я использую синтаксис и функции Mongo и ES6.

Что происходит и как я могу это исправить?


person Adriano Di Giovanni    schedule 24.10.2015    source источник
comment
Я могу опубликовать ответ, но мне нужна последняя информация: используете ли вы Mongo в своих тестовых кодах?   -  person Kyll    schedule 24.10.2015
comment
Да. В библиотеке/коллекции/Accounts.js. Accounts = new Mongo.Collection('owa-accounts');   -  person Adriano Di Giovanni    schedule 24.10.2015


Ответы (1)


Использование пакета с api.use('other-package') в Package.onUse не делает 'other-package' доступным в ваших тестовых кодах в том же таким образом, он не делает его доступным для других пакетов, которые use('my-package'), или в приложениях, которые meteor add my-package. Для решения этой проблемы есть два решения в зависимости от потребности в other-package :

  1. Предоставление пользователям пакета (включая ваши тесты) доступа к 'other-package' с помощью api.imply

    Package.onUse(function (api) {
      //...
      api.imply('other-package')
      //...
    })
    

    Это имеет смысл тогда и только тогда, когда пакет, который вы imply, необходим для использования вашего собственного пакета. Не делайте imply все волей-неволей для удобства охвата. Подробнее см. в этом вопросе.
    Если он не попадает в эту категорию,

  2. Просто use пакет в ваших тестах

    Package.onTest(function (api) {
      //...
      api.use('my-package')
      api.use('other-package')
      //...
    })
    

    Это позволит вам использовать other-package и в ваших тестах, не загрязняя области видимости.

person Kyll    schedule 24.10.2015
comment
Шаблон package.js из Meteor версии 1.2.0.2 имеет api.use('ecmascript') в Package.onUse и Package.onTest. Итак, я думаю, вы правы. Тем не менее, мой вопрос заключается в следующем: почему тесты требуют явного указания зависимостей моего пакета, если я не использую эти зависимости в тестовом коде? Я имею в виду, что Mongo используется внутри моего пакета, но я не использую Mongo в тестах. Если бы я использовал свой пакет в приложении, я бы не стал meteor add mongo работать с моим пакетом. Разве это не то же самое? Не знаю, понятно ли :) - person Adriano Di Giovanni; 25.10.2015
comment
О, из вашего ответа на мой комментарий я подумал, что вы тоже использовали Mongo в своих тестах. Это действительно довольно странно, я сам заметил некоторые подобные странности при тестировании пакетов на Meteor 1.2. Я сделаю еще несколько тестов и вернусь к вам. - person Kyll; 25.10.2015