【问题标题】:From where are the words: "describe" and "it" coming from?“描述”和“它”这两个词是从哪里来的?
【发布时间】:2021-10-29 20:58:51
【问题描述】:

我看到一个使用 Node.js 构建的应用程序,但我不明白 describeit 这两个词是如何可用的?

在浏览器控制台中it 是一个函数,describe 抛出一个ReferenceError

我知道它们是用来测试的。

const {assert} = require('chai');
const {jsdom} = require('jsdom');

const parseTextFromHTML = (htmlAsString, selector) => {
  const selectedElement = jsdom(htmlAsString).querySelector(selector);
  if (selectedElement !== null) {
    return selectedElement.textContent;
  } else {
    throw new Error(`No element with selector ${selector} found in HTML string`);
  }
};

describe('User visits index', () => {
  describe('to post an order', () => {
    it('starts with a blank order', () => {
      browser.url('/');

      assert.equal(browser.getText('#deliver-to span'), '');
      assert.equal(browser.getText('#cake-type span'), '');
      assert.equal(browser.getText('#fillings span'), '');
      assert.equal(browser.getText('#size span'), '');
    });
  });
});

【问题讨论】:

  • 可能来自使用require 导入的库之一。

标签: javascript node.js testing


【解决方案1】:

mocha 是 NodeJS 的测试框架。

chai 是 Mocha 常用的断言库。

it() 和 describe() 来自 mocha,您通过 require ('chai') 隐式导入:

Introduction to Testing in Mocha and Chai

摩卡挂钩:

  • it:定义单个测试。
  • describe:定义一个测试块。

【讨论】:

  • 框架可能会在 JavaScript 中添加新的关键字?
  • @Marian07 它们不是关键字,它们只是函数名称,例如 alertfunction foo() {} 将如何引入名称 foo
  • @Marian07 许多现代框架正在远离定义全局变量和函数——“副作用”——转而在自己的模块化范围内显式导出部件。这允许开发人员挑选他们想要的东西。对于面向用户的代码,流氓全局变量可能会导致问题甚至安全问题(过去可以更改 undefined)。最近,只有用于尽快编写测试的以测试为中心的代码是唯一的例外,但即便如此,它们的全局变量也可能在其他地方引起问题(无论如何都应该被测试所接受)。
  • @samthecodingman:直到最近,Javascript 本身才没有任何“模块范围”或“命名空间”的概念。因此,需要框架来发明自己的机制和临时约定。或者,更常见的是,只是污染全局命名空间 :( 当 Netscape 在 90 年代初期指派 Brendan Eich 为他们的浏览器编写一个小脚本引擎时,我敢肯定他从未想过它会发展成今天的 Javascript/ECMAScript !
  • @paulsm4 我认为非常流行的模块模式与“模块范围”非常相似。这也是早期模块化的完成方式——通过将每个文件包含在一个模块中,并且 import/requires 成为其中的输入,exports 变成了输出。 ES6 将这一点正式纳入规范,但这个概念在 ES6 之前已经存在多年。
猜你喜欢
  • 2018-09-25
  • 1970-01-01
  • 2020-07-31
  • 2019-11-18
  • 2014-10-23
  • 2022-09-29
  • 2018-02-26
相关资源
最近更新 更多