Mocha入门

官网地址

一、Getting Started

  1. 初始化:npm init
PS G:\vuejs\vue2_practice\mocha> npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install ` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (mocha) mocha-demos
version: (1.0.0)
description: mocha demos
entry point: (index.js)
test command:
git repository:
keywords: mocha
author: Beiyu
license: (ISC) MIT
About to write to G:\vuejs\vue2_practice\mocha\package.json:

{
  "name": "mocha-demos",
  "version": "1.0.0",
  "description": "mocha demos",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "mocha"
  ],
  "author": "Beiyu",
  "license": "MIT"
}


Is this OK? (yes)
  1. 安装mocha:npm i mocha --save-dev
PS G:\vuejs\vue2_practice\mocha> npm i mocha --save-dev
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN [email protected] No repository field.

+ [email protected]
added 24 packages from 436 contributors in 33.405s
  1. mkdir test
PS G:\vuejs\vue2_practice\mocha> mkdir test


    目录: G:\vuejs\vue2_practice\mocha


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2018-12-16      9:46                test
  1. new-item test/test.js -type file
PS G:\vuejs\vue2_practice\mocha> new-item test/test.js -type file


    目录: G:\vuejs\vue2_practice\mocha\test


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-12-16      9:46              0 test.js
  1. test/test.js中编辑
let assert = require('assert');
describe('Array', () => {
  describe('#indexOf()', () => {
    it('should return -1 when the value is not present', () => {
      assert.equal([1,2,3].indexOf(4), -1);
    })
  })
})
  1. 运行$ mochamocha test$ mocha test/test.js
PS G:\vuejs\vue2_practice\mocha> mocha


  Array
    #indexOf()
      √ should return -1 when the value is not present


  1 passing (5ms)
  1. package.json中设置一个测试脚本(Set up a test script in package.json)
"scripts": {
  "test": "mocha"
}
  1. 然后运行(Then run tests with):$ npm test
PS G:\vuejs\vue2_practice\mocha> npm test

> [email protected] test G:\vuejs\vue2_practice\mocha
> mocha



  Array
    #indexOf()
      √ should return -1 when the value is not present


  1 passing (6ms)

二、Run Cycle Overview(运行循环概述)

关于Mocha的组件执行顺序的简要概述。值得注意的是,所有钩子,描述和回调都按照它们被定义的顺序运行(即在文件中找到)。

【A brief outline on the order Mocha’s components are executed. Worth noting that all hooks, describe and it callbacks are run in the order they are defined (i.e. found in the file).】

run 'mocha spec.js'
|
spawn child process
|
|--------------> inside child process
  process and apply options
  |
  run spec file/s
  |
  |--------------> per spec file
    suite callbacks (e.g., 'describe')
    |
    'before' root-level pre-hook
    |
    'before' pre-hook
    |
    |--------------> per test
      'beforeEach' root-level pre-hook
      |
      'beforeEach' pre-hook
      |
      test callbacks (e.g., 'it')
      |
      'afterEach' post-hook
      |
      'afterEach' root-level post-hook
    |<-------------- per test end
    |
    'after' post-hook
    |
    'after' root-level post-hooks
  |<-------------- per spec file end
|<-------------- inside child process end

三、Detects Multiple Calls to DONE()(检测多次回调)

如果使用基于回调的异步测试,如果多次调用done(),Mocha将抛出错误。这对于捕获意外的双重回调非常方便。

【If you use callback-based async tests, Mocha will throw an error if done() is called multiple times. This is handy for catching accidental double callbacks.】

新建test/multi-calls.js

let assert = require('assert')
describe('Multiple calls', () => {
  it('should throw an error', (done) => {
    setImmediate(done)
    setImmediate(done)
  })
})
PS G:\vuejs\vue2_practice\mocha> mocha test/multi-calls.js


  Multiple calls
    √ should throw an error
    1) should throw an error


  1 passing (6ms)
  1 failing

  1) Multiple calls
       should throw an error:
     Error: done() called multiple times
Mocha入门_第1张图片
multiple calls throw error

四、Assertions(断言)

Mocha允许您使用任何您想要的断言库。在上面的例子中,我们使用Node.js的内置断言模块 - 但一般来说,如果它抛出一个Error,它就会工作!这意味着您可以使用以下库:

Mocha allows you to use any assertion library you wish. In the above example, we’re using Node.js’ built-in assert module–but generally, if it throws an Error, it will work! This means you can use libraries such as:

  • should.js - BDD style shown throughout these docs
  • expect.js - expect() style assertions
  • chai - expect(), assert() and should-style assertions
  • better-assert - C-style self-documenting assert()
  • unexpected - “the extensible BDD assertion toolkit”

五、Asynchronous Code(异步代码)

用Mocha测试异步代码再简单不过了!只要在测试完成时调用回调即可。通过向it()添加回调(通常称为done), Mocha将知道它应该等待这个函数被调用来完成测试。该回调既接受错误实例(或其子类),也接受falsy值;否则将导致测试失败。

Testing asynchronous code with Mocha could not be simpler! Simply invoke the callback when your test is complete. By adding a callback (usually named done) to it(), Mocha will know that it should wait for this function to be called to complete the test. This callback accepts both an Error instance (or subclass thereof) or a falsy value; anything else will cause a failed test.

你可能感兴趣的:(Mocha入门)