当包有 api.use('mongo') 时,为什么在包测试中使用 Mongo 会失败?

Why does using Mongo in package tests fail when the package has 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:jasmine@0.20.2',
    'velocity:html-reporter',
  ]);
  api.use('adigiovanni:one-way-accounts');
  api.addFiles('tests/client/OneWayAccounts.js', 'client');
  api.addFiles('tests/server/OneWayAccounts.js', 'server');
});

如您所见,包使用了 'mongo'

测试失败:

Reference error: Mongo is not defined

但是如果我取消注释行 api.imply('mongo') 那么测试就会成功。

同样奇怪的行为适用于 ecmascript 依赖项,如果我在 Package.onTest 中不 api.use('ecmascript'),测试将失败。

Meteor 版本为 1.2.0.2。
测试跑步者是速度。
测试框架是 jasmine.
我在测试中使用 Mongo 和 ES6 语法和功能。

这是怎么回事,我该如何解决?

Package.onUse 中使用带有 api.use('other-package') 的包不会使 'other-package' 在您的测试代码中可用,就像它不会使其他包可用一样 use('my-package')meteor add my-package 的应用程序中。要解决此问题,有两种解决方案,具体取决于 other-package 的需要:

  1. 允许包的用户(包括您的测试)使用 api.imply

    访问 'other-package'
    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,而不会污染范围。