在测试中从 ember cli 插件访问虚拟项目的根路径

access dummy project's root path from ember cli addon in tests

场景:我想知道访问使用插件的项目的根路径的正确方法 - 在测试时也可以使用...

例如,插件:

// ember-cli-myaddon/index.js
{

  ...

  contentFor(name) {
    if (name ==='body') {
      var filePath = path.join(this.app.project.root, 'app/some-file.html')
      var file = fs.readFileSync(filePath);

      return [file];
    }
  },

  ...

}

^ 在实际项目中使用插件时有效。

然而,当我 运行 测试插件时,this.app.project.root~/ember-cli-myaddon/app/some-file.html

当我期望(需要)它是~/ember-cli-myaddon/tests/dummy/app/some-file.html

经过一些 ember 插件挖掘后,我发现了 ember-cli-mirage 中使用的一个很棒的 sol'n,https://github.com/samselikoff/ember-cli-mirage/blob/master/ember-cli-build.js

要点是文件路径在插件的 ember-cli-build.js 中指定,插件从 属性, 空白时默认为 this.app.project.root.

例如

// ember-cli-myaddon/index.js

// added this
included: function() {
  this.addonPath = this.app.options['myaddon']['directory'] || 'app';
},

// modified filePath
contentFor(name) {
  if (name ==='body') {
    var filePath = path.join(this.app.project.root, this.addonPath, 'some-file.html');
    var file = fs.readFileSync(filePath);

    return [file];
  }
}

然后在插件的 ember-cli-build.js 文件中,我们指定虚拟应用程序的目录:

// ember-cli-build.js

  /* global require, module */

  var path = require('path');
  var EmberApp = require('ember-cli/lib/broccoli/ember-addon');

  module.exports = function(defaults) {
    var app = new EmberApp(defaults, {
      'myaddon': {
        directory: path.join('tests', 'dummy')
      }
    });

    return app.toTree();
  };

现在,插件测试寻找 some-file.html at:
ember-cli-myaddon/tests/dummy/app/some-file.html

在真实项目中,some-file.html 位于:
your-project/app/some-file.html

此外,您还可以获得允许用户在其 ember-cli-build.js 文件中配置文件路径的好处! win/win/win