【问题标题】:Why does using Mongo in package tests fail when the package has api.use('mongo')?当包有 api.use('mongo') 时,为什么在包测试中使用 Mongo 会失败?
【发布时间】:2015-10-25 02:50:08
【问题描述】:

我正在开发一个自定义包。它的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'

测试失败:

参考错误:Mongo 未定义

但如果我取消注释 api.imply('mongo') 行,则测试成功。

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

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

发生了什么,我该如何解决?

【问题讨论】:

  • 我可以发布答案,但我需要最后一点信息:您在测试代码中使用Mongo 吗?
  • 是的。在 lib/collections/Accounts.js 中。 Accounts = new Mongo.Collection('owa-accounts');

标签: javascript meteor meteor-velocity meteor-packages


【解决方案1】:

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 一切为了范围方便。查看更多in this question.
    如果它不属于该类别,

  2. 只需 use 测试中的包

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

    这将允许您在测试中也使用other-package,而不会污染范围。

【讨论】:

  • package.js Meteor 版本 1.2.0.2 的样板在 Package.onUsePackage.onTest 中有 api.use('ecmascript')。所以,我认为你是对的。尽管如此,我的问题是:如果我不在测试代码中使用这些依赖项,为什么测试需要明确列出我的包的依赖项?我的意思是,我的包内部使用了 Mongo,但我在测试中不使用 Mongo。如果我在应用程序中使用我的包,我不会meteor add mongo 来让我的包正常工作。不是一样的吗?我不知道这是否清楚:)
  • 哦,从您对我的评论的回答来看,我认为您在测试中也使用了 Mongo。这确实很奇怪,我注意到自己在 Meteor 1.2 上进行包测试时也有一些类似的奇怪之处。我会再做一些测试,然后再回复你。
猜你喜欢
  • 1970-01-01
  • 2021-01-06
  • 2013-01-19
  • 2021-06-20
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多