【问题标题】:Is there a reason that mocha does not support describes within it functions?mocha 不支持在其功能中进行描述是否有原因?
【发布时间】:2014-11-12 19:34:42
【问题描述】:

使用 mocha+protractor... 示例...您有一个测试规范可以访问网页并从该网页上刮取数据。

您有一个描述,然后是一系列访问网页的描述。

在此之后,您希望包含另一个它来处理抓取的数据并测试有效性/完整性,然后为抓取的每个数据点生成一套新的测试。

根据我的发现,根据 pre-require 和 require 事件发出的方式,设置全局描述和它的功能(及其关联的上下文),Mocha 目前不支持此功能。

我可以很容易地覆盖描述,它可以手动将新生成的套件和测试/等附加到正确的父级......然后将它们设置回原来的样子......但想知道是否有根本原因(似乎)没有故意阻止现有代码库发生这种情况。

【问题讨论】:

  • 我猜你可以用嵌套的描述和之前实现同样的事情。 imo 中的嵌套描述读起来不会特别好。
  • 好点。没想到这个组合。我只是试图以这种方式在之前生成测试,并将它们放在根套件下,而不是在直接的描述父级中......这就是为什么我正在考虑简单地覆盖描述以便它具有正确的父母。

标签: mocha.js protractor


【解决方案1】:

它不起作用,因为 Mocha 运行这样的测试套件:

  1. 查找测试。当describe 执行 Mocha 时记录名称并立即执行回调。当it 或钩子(beforebeforeEach、...)执行时,Mocha 记录测试名称(仅限it)并记录供将来执行给定的回调。

  2. 运行测试。 Mocha 以正确的顺序运行给it 和钩子的回调。 此时无法再调用 describeit 并让它们正常运行。 在一些关于 SO 的问题中,我看到有些人在回调中调用 it it 并得到某种行为,但这只是运气。摩卡不是为这种东西设计的。

还有结构性问题。 describe 可以包含describeit,但it 不能包含子结构。我猜it 中的describe 可能会以某种方式附加到it 的父describe。还有异步测试的问题:其中的describe 会附加到哪里? (当异步代码执行时,VM 已经超出了it 的范围。)我不清楚钩子的语义是否可以保持。

阅读有关问题的 cmets:不,您不应该将 it 放入 before 钩子中。但是,您可以这样做:

describe("top", function () {

   var test = callSomethingThatReturnsAnArrayOfTestInformation();
   for(var i = 0, test; (test = tests[i]); ++i) {
       it("test " + i, function () {
          // do something with `test`
       });
   }
});

在某些测试套件中,我对目录中的每个文件执行一项测试,我的callSomething... 将是fs.readdirSync(...)

【讨论】:

  • 谢谢。感谢您抽出宝贵的时间回复...并感谢您对前钩子的澄清。关于您的代码的问题,因为这是我之前考虑过的,但遇到了问题......“callSomething ....”调用取决于先前描述中运行的数据......并且因为它不返回承诺,它由量角器调度程序立即执行(在它运行其他套件的 it() 以确定数据之前)。你知道解决这个问题的方法吗?
猜你喜欢
  • 2020-09-17
  • 2020-08-04
  • 1970-01-01
  • 2017-08-30
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 2018-09-21
相关资源
最近更新 更多