【问题标题】:Read arguments from constructor call从构造函数调用中读取参数
【发布时间】:2016-12-13 19:26:46
【问题描述】:

给定

const anInstance = new Plugin({ a: 'path' })

你能返回给定的参数吗?

anInstance./* some method */ === [{ a: 'path' }]

// or

someWrapper(anInstance) === [{ a: 'path' }]

限制:

  1. 您不能更改Plugin 的内部实现:视为外部依赖项。
  2. Plugin 可能有多个参数,任何类型。
  3. 您不能将初始参数分配给外部变量,如下所示:

    const config = { a: 'path' }
    const anInstance = new Plugin(config)
    

背景:我正在尝试为 webpack 插件配置编写测试。例如:

module.exports = {
  plugins: [
    new wepback.DllPlugin({
      name: '[name]',
      path: path.join(buildDir, '[name].json'),
    })
  ]
}

我想测试给 DllPlugin 的配置。上面的限制 #3 是因为我不想在导出的唯一使用者是我的测试时导出每个插件的配置。

如果没有办法完成我最初的要求,那么我将不得不添加这些导出,因为我想不出任何其他方式来访问这些参数。

【问题讨论】:

    标签: javascript unit-testing arguments


    【解决方案1】:

    你可以定义一个class,使用extend

    function Plugin() {}
    
    class getPluginArgs extends Plugin {
      constructor(...args) {
        super();
        this.args = args;
        for (let arg of args) {
          console.log(arg)
        }
      }
      getArgs() {
        return this.args;
      }
    }
    
    const anInstance = new getPluginArgs({ a: "path" });
    console.log(anInstance instanceof Plugin, anInstance.getArgs());

    【讨论】:

    • 每节课我都必须这样做吗?例如,如果我有PluginPlugin2,我需要getPluginArgsgetPluginArgs2
    • @neezer 如果功能不同,是的。 PluginPlugin2 不同,是吗?您可能可以创建一个函数,您可以将函数引用传递给该函数,该函数创建并扩展class,以执行该过程。
    • @neezer 另见Classes
    • 是的,Plugin, Plugin2, ... PluginN 都是不同的和独特的,所以我想要一个不依赖于任何特定版本的解决方案。
    • @neezer 注意,原始问题没有描述在多个构造函数上执行该过程。原始问题的要求描述了将参数传递给Plugin。如果要求将参数传递给构造函数,您可以创建一个通用函数,该函数在 Answer 的javascript 处动态执行该过程,然后返回实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2015-02-03
    • 2016-03-11
    • 1970-01-01
    相关资源
    最近更新 更多