Javascript 如何将参数/参数传递给通过Grunt调用的mocha测试

Javascript 如何将参数/参数传递给通过Grunt调用的mocha测试,javascript,node.js,gruntjs,mocha.js,integration-testing,Javascript,Node.js,Gruntjs,Mocha.js,Integration Testing,我有一个Gruntfile.js,通过它我使用grunt mocha测试模块调用mochaTest。我可以从命令行将参数/参数传递给gruntTask,但我很难将相同的参数传递到通过上述模块运行的spec文件中。代码如下所示 mochaTest: { test: { options: { reporter: 'spec', quiet: false, clearRequireCache: false, clearCacheFilter:

我有一个Gruntfile.js,通过它我使用grunt mocha测试模块调用mochaTest。我可以从命令行将参数/参数传递给gruntTask,但我很难将相同的参数传递到通过上述模块运行的spec文件中。代码如下所示

mochaTest: {
  test: {
    options: {
      reporter: 'spec',
      quiet: false,
      clearRequireCache: false,
      clearCacheFilter: (key) => true,
      noFail: false
    },
    src: [
          'test/createSpec.js'
         ]
  }
}
grunt.registerTask('e2etest', function(scope) {
  console.log(scope); // logs user/session based on the parameter passed
  grunt.task.run('mochaTest');
});
// Above task is invoked like,
grunt e2etest:user
(or)
grunt e2etest:session
任务的注册方式如下所示

mochaTest: {
  test: {
    options: {
      reporter: 'spec',
      quiet: false,
      clearRequireCache: false,
      clearCacheFilter: (key) => true,
      noFail: false
    },
    src: [
          'test/createSpec.js'
         ]
  }
}
grunt.registerTask('e2etest', function(scope) {
  console.log(scope); // logs user/session based on the parameter passed
  grunt.task.run('mochaTest');
});
// Above task is invoked like,
grunt e2etest:user
(or)
grunt e2etest:session
我需要将这个值(用户/会话)传递到mochaTest中,以便可以在spec文件中访问它。基本上,其目的是为用户和会话运行createSpec.js文件,该值在spec文件中参数化,并基于套件将运行的传递值

有可能这样做吗?请告知。

您可以利用节点从名为
createSpec.js
的文件中读取参数(即
user
session

要更好地了解如何操作,请遵循以下步骤:

  • createSpec.js的顶部添加以下代码行:

    console.log(process.argv);
    
  • 然后通过CLI运行
    grunt e2etest:user
    ,您应该会看到以下内容记录到控制台:

    ['node','/usr/local/bin/grunt','e2etest:user']

    注意:所需信息位于数组的索引2处

  • 现在,删除我们刚刚添加的行,它的内容是
    console.log(process.argv)来自
    createSpec.js


  • createSpec.js

    因此,上述步骤(1-3)说明了参数(
    user
    session
    )可以在
    createSpec.js
    中使用
    process.argv
    访问。在这种情况下,您可以在
    createSpec.js
    中执行以下操作

    const-argument=process.argv[2]。拆分(“:”).pop();
    如果(参数=='user'){
    //在此处运行“用户”特定的测试。。。
    }else if(参数==='session'){
    //在此处运行“会话”特定测试。。。
    }
    
    注意,我们使用的是
    process.argv[2].split(/:/).pop()
    从位于索引2的数组项中提取
    user
    session
    ,其初始值将分别为
    e2etest:user
    e2etest:session


    Gruntfile

    您的
    createSpec.js
    文件现在在某种程度上依赖于名为
    e2etest
    的grunt任务的正确调用。例如,如果用户在不提供参数的情况下运行
    grunt e2etest
    ,那么
    createSpec.js
    就不会有什么作用

    要强制正确使用
    e2etest
    任务(即必须使用
    grunt e2etest:user
    grunt e2etest:session
    运行任务),您可以在
    Gruntfile
    中更改任务,如下所示:

    grunt.registerTask('e2etest',函数(作用域){
    如果(!scope | |!(scope=='user'| | scope=='session')){
    warn(`必须用${this.name}:user或${this.name}:session`调用);
    }
    grunt.task.run('mochaTest');
    });
    
    上面的要点首先检查是否提供了一个参数,该参数是
    用户
    会话
    。如果参数不正确或丢失,则使用该参数警告用户

    如果您的nodejs版本不支持,请改用
    grunt.warn
    ,如下所示:

    grunt.warn('Must be invoked with: ' + this.name + ':user or ' + this.name + ':session');
    

    附加评论

    如果您的用例与您在问题中提到的完全一致,那么上面的createSpec.js部分中显示的代码/要点将起作用。即,通过命令行使用
    grunt e2etest:user
    grunt e2etest:session
    调用。但是,如果这种情况发生了变化,并且您无法保证
    e2etest:user
    e2etest:session
    将精确定位在
    进程.argv
    数组的索引2处,那么您可能需要在
    createSpec.js
    的顶部执行以下操作:

    //返回数组中以开头的值
    //`e2etest`然后提取冒号“”后面的字符串:`
    常量参数=process.argv.filter(arg=>{
    返回参数匹配(/^e2etest:.*/);
    }).toString().split(“:”).pop();
    如果(参数=='user'){
    //在此处运行“用户”特定的测试。。。
    }else if(参数==='session'){
    //在此处运行“会话”特定测试。。。
    }
    
    有关详细信息,请参阅此,我认为您需要的解决方案是:

    node node_模块/mocha/bin/_mocha