测试指南

此测试指南基于 Mocha BDD 接口(describe / it)。

主要原则

测试必须从干净的状态开始

这意味着优先使用 beforeEach 而不是 before。在运行每个 it 块之前重新实例化对象。在 beforeEach 中创建测试所需的每个文件(或将它们提交到 fixtures/ 中)。在每次测试后重置对测试环境进行的任何副作用。

测试必须能够独立运行

如果单独运行,每个测试都必须通过。您可以使用 mocha test.js --grep 'test name' 运行单个测试。

模拟大多数性能密集型操作

如果可能,始终模拟网络或其他长时间操作。

我们使用 sinon.js 来满足大多数模拟需求。

命名约定

describe 块应包含三种类型的信息:要测试的对象、方法/属性、环境组(基本上是“当this时”)。

it 块包含断言。它们应使用尽可能少的代码行。对于方法效果上的每个断言,都应有尽可能多的 it 块。

实例方法和属性应以感叹号为前缀(#find())。静态方法和属性应以点为前缀(.exclude())。

// Given this object
function Class() {
  this.args = nopt();
};
Class.exclude = function () {};
Class.name = 'Yeoman';
Class.prototype.find = function () {};

// We'd have this test structure
describe('Class', function () {
  describe('.exclude()', function () {});
  describe('.name', function () {});
  describe('#find()', function () {});
  describe('#args', function () {});
});

方法应以括号结尾,但不应包含预期参数(参数应在文档注释中说明)。

it 块应具有声明性。

// BAD
it('should find generators');

// GOOD
it('find generators');

断言

除非抛出的错误使失败原因不清楚,否则不要向断言添加 message

如果必须添加消息,则描述预期结果以及失败的原因。例如

// BAD
assert(Generator.appname, 'Generator has an `appname` property');

// GOOD
assert(Generator.appname, 'Expected Generator to have an `appname` property');

请记住,这些消息是随失败一起抛出的错误消息。在这些情况下,让它们有用。

风格偏好

.bind() 抛出断言

在测试方法在使用无效参数时是否抛出异常时,优先使用绑定参数而不是创建匿名函数。

// BAD
assert.throws(function () {
  class.method('Invalid param');
});

// GOOD
assert.throws(class.method.bind(class, 'Invalid param'));