如何适当地重用 mocha 测试的 describe 块?

Posted

技术标签:

【中文标题】如何适当地重用 mocha 测试的 describe 块?【英文标题】:How to appropriately reuse the describe blocks of mocha tests? 【发布时间】:2018-01-03 15:03:14 【问题描述】:

我有一个以不同模式运行的应用程序(将其视为针对不同平台运行以及使用不同协议),其中一个应用程序在每次打开页面时都有很长的加载时间。还有一些其他小的变化,但所有这些都可以使用 wdio 的设置变量来处理。

目前我为应用程序的每个部分都有一个测试文件(带有描述)。如果正在测试的配置之一没有这么长的等待时间,那会很好。无论如何,我决定处理这个测试用例,将它们全部处理在一个文件中,所有文件都在同一个页面上。

无论如何,与其将我之前的所有测试复制并粘贴到这个大文件中,我想知道是否可以以某种方式重用它们,就好像它们是函数一样。

现在我只是将东西包装在函数中,例如:

// test1.js
module.exports = function test1 () 
  describe('Test1', function () 
    var settings = 

    before(function () 
     // do something
    )

    it('do something', function () 
      assert.ok(true)
    )
    it('do something else', function () 
          assert.ok(true)
    )
  )

在另一个文件中,我们运行我们创建的每个函数:

test1 = require('./test1')
test2 = require('./test2')
...
test10 = require('./test10')
describe('Main Test', function () 
  test1()
  test2()
  ...
  test10()

如果我能以某种方式选择在我的命令上运行哪些测试函数,这将解决我的 DRY 问题

wdio wdio/wdio.conf.js --specs wdio/test/spects/browser/test1.js

这显然行不通。

基本上,我想要一个能够重用我的测试(描述块)的解决方案。我正在做的事情是正确的吗?如果没有,应该怎么做?

【问题讨论】:

很不清楚“同一页面上的一个文件”是什么意思。并且代码没有显示任何代码共享。 【参考方案1】:

所以在我找到了一些关于它的文档here 之后,我找到了解决这个问题的最佳方法。

我会按照我之前描述的那样做,但是我不会将所有这些函数都放在同一个文件中,而是将它们保存在它们自己的文件中。仍然可能有更好的解决方案,但是对于运行我的应用程序的不同模式复制和粘贴所有测试用例,它仍然是一个改进。

【讨论】:

【参考方案2】:

只需以编程方式创建不同的描述块。将 describe 块包装在一个函数中,其中包含所有更改的参数(包括块的名称),然后简单地调用该函数来创建变体。

我做了一个小回购来在实践中展示这一点:https://github.com/fatso83/forum-support-code/commit/cb2bc10b1d8bdae31e8f0a8c4e724c70583a5e11

【讨论】:

当您需要变量在所需文件和所需文件中都可见时,这不能很好地工作。例如,要在“用户登录时”创建共享上下文,并使用户在上下文中可用。至少,我无法让这样的事情发挥作用。 你在混合东西。不同的文件不会改变概念。如果您可以使用闭包来做到这一点,那么您当然可以使用不同的文件来做到这一点(这只是代码组织)。您可以通过将用户上下文发送到创建描述块的函数来共享用户上下文。 @Pistos 如果您需要动态创建测试套件的示例,我可以在 Runkit 上创建一个示例。 我遇到的问题是我的共享代码引入的user 实例(例如,通过let)需要对内部块可用。例如whenUserSignedIn( function(user) describe('more tests here')..... ) 不仅如此,超测代理还需要在whenUserSignedIn 代码和require 共享代码的文件之间共享。特别是,agent 将在 require-ing 代码中实例化(在 beforeEach 中,不少于),但在共享代码中使用。这一切都只是混乱和令人沮丧,与 rspec 的易用性相去甚远。 你不能在共享代码中导出函数并在需要时将变量传递给该函数吗?我看不出单独的文件如何使这变得更难,但我会调查一下。多次使用这种方法

以上是关于如何适当地重用 mocha 测试的 describe 块?的主要内容,如果未能解决你的问题,请参考以下文章

Mocha describe 生命周期

我如何使用 Mocha 和 Chai 对 Node 创建的端点进行异步测试?

javascript 解释Mocha的测试框架 - describe(),it()和before()/ etc钩子

Mocha 如何执行“it”调用?如何同步执行测试?

使用 Mocha 测试是不是抛出异步函数

如何在多个文件中设置mocha测试用例的执行顺序