INTERFACES

mocha的测绘接口类型指的是集中测试用例组织模式的选择。Mocha提供了BDD,TDD,Exports,QUnitRequire-style几种接口。

BDD


BDD测试提供了describe(),context(),it(),specify(),before(),after(),beforeEach()和afterEach()这几种函数。

context()是describe()的别名,二者的用法是一样的。最大的作用就是让测试的可读性更好,组织的更好。相似地,specify()是it()的别名。

上面的所有测试都是用BDD风格的接口写的。

  1. describe('Array', function() {
  2. before(function() {
  3. // ...
  4. });
  5. describe('#indexOf()', function() {
  6. context('when not present', function() {
  7. it('should not throw an error', function() {
  8. (function() {
  9. [1,2,3].indexOf(4);
  10. }).should.not.throw();
  11. });
  12. it('should return -1', function() {
  13. [1,2,3].indexOf(4).should.equal(-1);
  14. });
  15. });
  16. context('when present', function() {
  17. it('should return the index where the element first appears in the array', function() {
  18. [1,2,3].indexOf(3).should.equal(2);
  19. });
  20. });
  21. });
  22. });

TDD


TDD风格的测试提供了suite(), test(), suiteSetup(), suiteTeardown(), setup(), 和 teardown()这几个函数:

  1. suite('Array', function() {
  2. setup(function() {
  3. // ...
  4. });
  5. suite('#indexOf()', function() {
  6. test('should return -1 when not present', function() {
  7. assert.equal(-1, [1,2,3].indexOf(4));
  8. });
  9. });
  10. });

Exports


Exports 的写法有的类似于Mocha的前身expresso,键 before, after, beforeEach, 和afterEach都具有特殊的含义。对象值对应的是测试集合,函数值对应的是测试用例。

  1. module.exports = {
  2. before: function() {
  3. // ...
  4. },
  5. 'Array': {
  6. '#indexOf()': {
  7. 'should return -1 when not present': function() {
  8. [1,2,3].indexOf(4).should.equal(-1);
  9. }
  10. }
  11. }
  12. };

QUNIT


QUNIT风格的测试像TDD接口一样支持suite和test函数,同时又像BDD一样支持before(), after(), beforeEach(), 和 afterEach()等钩子函数。

  1. function ok(expr, msg) {
  2. if (!expr) throw new Error(msg);
  3. }
  4. suite('Array');
  5. test('#length', function() {
  6. var arr = [1,2,3];
  7. ok(arr.length == 3);
  8. });
  9. test('#indexOf()', function() {
  10. var arr = [1,2,3];
  11. ok(arr.indexOf(1) == 0);
  12. ok(arr.indexOf(2) == 1);
  13. ok(arr.indexOf(3) == 2);
  14. });
  15. suite('String');
  16. test('#length', function() {
  17. ok('foo'.length == 3);
  18. });

REQUIRE


require可以使用require方法引入describe函数,同时,你可以为其设置一个别名。如果你不想再测试中出现全局变量,这个方法也是十分实用的。

注意:这种风格的测试不能通过node命令来直接运行,因为,这里的require()方法node是不能够解析的,我们必须通过mocha来运行测试。

  1. var testCase = require('mocha').describe;
  2. var pre = require('mocha').before;
  3. var assertions = require('mocha').it;
  4. var assert = require('chai').assert;
  5. testCase('Array', function() {
  6. pre(function() {
  7. // ...
  8. });
  9. testCase('#indexOf()', function() {
  10. assertions('should return -1 when not present', function() {
  11. assert.equal([1,2,3].indexOf(4), -1);
  12. });
  13. });
  14. });