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

时间:2018-01-30 03:22:15

标签: javascript node.js gruntjs mocha integration-testing

我有一个Gruntfile.js,通过它我可以使用grunt-mocha-test模块调用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,以便可以在spec文件中访问它。从根本上说,目标是为用户和会话运行createSpec.js文件,这些值在spec文件中进行参数化,并基于套件运行的值。

有可能这样做吗?请指教。

2 个答案:

答案 0 :(得分:1)

有关详细信息,请参阅此issue,我认为您需要的解决方案是:

node <node flags here> node_modules/mocha/bin/_mocha <mocha arguments here>

答案 1 :(得分:0)

您可以利用节点process.argv从名为user的文件中读取参数(即sessioncreateSpec.js)。

要更好地了解具体方法,请按以下步骤操作:

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

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

      

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

    注意:您想要的信息位于数组的索引2处。

  3. 现在,删除我们刚刚添加的来自console.log(process.argv);的{​​{1}}行。

  4. <强> createSpec.js

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

    createSpec.js

    注意,我们正在使用const argument = process.argv[2].split(':').pop(); if (argument === 'user') { // Run `user` specific tests here... } else if (argument === 'session') { // Run `session` specific tests here... } 从位于索引2的数组项中提取process.argv[2].split(/:/).pop();user,其初始值为session或分别为e2etest:user

    <强> Gruntfile

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

    要强制正确使用createSpec.js任务(即必须使用e2etestgrunt e2etest:user运行),您可以将grunt e2etest:session中的任务更改为如下:

    Gruntfile

    上面的要点最初检查是否已提供参数,并且是grunt.registerTask('e2etest', function(scope) { if (!scope || !(scope === 'user' || scope === 'session')) { grunt.warn(`Must be invoked with: ${this.name}:user or ${this.name}:session`); } grunt.task.run('mochaTest'); }); user。如果参数不正确或缺失,则使用grunt.warn来警告用户。

    如果您的nodejs版本不支持ES6 Template literals,请改为使用session,如下所示:

    grunt.warn

    其他评论

    如果您的用例完全如您在问题中提到的那样,上面 createSpec.js 部分中显示的代码/要点将会起作用。即您可以使用grunt.warn('Must be invoked with: ' + this.name + ':user or ' + this.name + ':session'); grunt e2etest:user通过命令行调用。但是,如果更改并且您无法保证grunt e2etest:sessione2etest:user将完全位于e2etest:session数组的索引2处,那么您可能需要在process.argv顶部执行以下操作{1}}代替:

    createSpec.js