在现代 JavaScript 开发中,单元测试是保证代码质量的重要手段。通过单元测试,你可以对代码进行自动化测试,确保其在不同情况下的表现符合预期。
Mocha 是一个流行的测试框架,而 Chai 是一个功能强大的断言库。本文将带你快速入门 Mocha 和 Chai,并展示如何编写简单的单元测试。
1. 什么是 Mocha 和 Chai
- Mocha:Mocha 是一个功能丰富、灵活的 JavaScript 测试框架,支持异步测试和多种测试风格(BDD、TDD)。
- Chai:Chai 是一个断言库,它与 Mocha 配合使用,支持多种风格的断言,包括
expect
、should
和assert
。
2. 安装 Mocha 和 Chai
首先,你需要在项目中安装 Mocha 和 Chai:
npm install --save-dev mocha chai
安装完成后,你可以通过修改 package.json
文件来配置 Mocha
的测试脚本:
{
"scripts": {
"test": "mocha"
}
}
3. 编写第一个测试用例
创建一个名为 test
的文件夹,并在其中创建测试文件 example.test.js
:
const { expect } = require('chai');
// 示例函数
const add = (a, b) => a + b;
describe('Addition function', () => {
it('should return the sum of two numbers', () => {
expect(add(2, 3)).to.equal(5);
});
});
运行测试:
npm test
你会看到测试通过的结果。如果修改了 expect(add(2, 3)).to.equal(5)
为其他数值,测试将失败。
4. Chai 断言风格
Chai 支持三种不同风格的断言:
4.1. Expect 风格
expect(foo).to.be.a('string');
expect(foo).to.equal('bar');
expect(foo).to.have.lengthOf(3);
4.2 Should 风格
foo.should.be.a('string');
foo.should.equal('bar');
foo.should.have.lengthOf(3);
4.3 Assert 风格
assert.typeOf(foo, 'string');
assert.equal(foo, 'bar');
assert.lengthOf(foo, 3);
5. 异步测试
Mocha 支持异步测试。你可以使用 done
回调,或者结合 async/await
和 chai-as-promised
来测试异步代码。
使用 done 回调:
it('should test async function', (done) => {
setTimeout(() => {
expect(true).to.be.true;
done();
}, 100);
});
使用 async/await 和 chai-as-promised:
npm install chai-as-promised
const chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);
it('should resolve the promise', async () => {
const promise = Promise.resolve('done');
await expect(promise).to.eventually.equal('done');
});
6. 多重断言
你可以在同一个测试中进行多重断言:
it('should pass all assertions', () => {
const result = { name: 'John', age: 30, active: true };
expect(result).to.have.property('name').that.equals('John');
expect(result).to.have.property('age').that.is.a('number');
expect(result).to.have.property('active').that.is.true;
});
7. 总结
Mocha
提供了灵活的测试框架,支持异步操作。Chai
是功能强大的断言库,支持多种断言风格。- 通过
chai-as-promised
,可以简化对异步代码的测试。
更多内容请参阅官方文档: