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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将参数/参数传递给通过Grunt调用的mocha测试相关的知识,希望对你有一定的参考价值。

我有一个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文件中进行参数化,并基于套件运行的值传递。

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

答案

您可以利用节点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);读取createSpec.js的行。

createSpec.js

因此,上面的步骤(1-3)说明可以使用usersession中访问参数(createSpec.jsprocess.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...
}

注意,我们使用process.argv[2].split(/:/).pop();从位于索引2的数组项中提取usersession,其初始值分别为e2etest:usere2etest:session


咕噜文件

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

要强制正确使用e2etest任务(即必须使用grunt e2etest:usergrunt 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');
});

上面的要点最初检查是否已提供参数,并且是usersession。如果参数不正确或缺失,则使用grunt.warn警告用户。

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

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

补充评论

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

// Return the value in the array which starts with
// `e2etest` then extract the string after the colon `:`
const argument = process.argv.filter(arg => {
  return arg.match(/^e2etest:.*/);
}).toString().split(':').pop();

if (argument === 'user') {
  // Run `user` specific tests here...
} else if (argument === 'session') {
  // Run `session` specific tests here...
}
另一答案

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

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

以上是关于如何将参数/参数传递给通过Grunt调用的mocha测试的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 docker run 将参数传递给 Shell 脚本

如何通过 HtmlDocument.InvokeScript 将对象作为参数传递给 javascript

如何通过 System.Diagnostics.Process() 将参数传递给已经打开的终端

如何将参数传递给使用 setTimeout 调用的函数?

如何将参数传递给无服务器调用本地

如何将参数传递给 BroadcastReceiver 的子类?