此测试指南基于 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'));