Generates Mocha tests in JavaScript with Chai assertions and Sinon mocking. Use when user mentions "Mocha", "Chai", "sinon", "describe/it (not Jest)". Triggers on: "Mocha", "Chai", "sinon", "mocha test".
Scanned 9/22/2026
Install to Claude Code
npx -y skills add NVlabs/Skill2Env --skill mocha-skill --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Mocha Skill?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/nvlabs-mocha-skill)More formats (shields.io, HTML) on the badges page.
---
name: mocha-skill
description: >
Generates Mocha tests in JavaScript with Chai assertions and Sinon mocking.
Use when user mentions "Mocha", "Chai", "sinon", "describe/it (not Jest)".
Triggers on: "Mocha", "Chai", "sinon", "mocha test".
languages:
- JavaScript
- TypeScript
category: unit-testing
license: MIT
metadata:
author: TestMu AI
version: "1.0"
---
# Mocha Testing Skill
## Core Patterns
### Basic Test with Chai
```javascript
const { expect } = require('chai');
describe('Calculator', () => {
let calc;
beforeEach(() => { calc = new Calculator(); });
it('should add two numbers', () => {
expect(calc.add(2, 3)).to.equal(5);
});
it('should throw on divide by zero', () => {
expect(() => calc.divide(10, 0)).to.throw('Division by zero');
});
});
```
### Chai Assertions
```javascript
expect(value).to.equal(5);
expect(arr).to.have.lengthOf(3);
expect(obj).to.have.property('name');
expect(str).to.include('hello');
expect(fn).to.throw(Error);
expect(arr).to.deep.equal([1, 2, 3]);
expect(obj).to.deep.include({ name: 'Alice' });
```
### Sinon Mocking
```javascript
const sinon = require('sinon');
describe('UserService', () => {
let sandbox;
beforeEach(() => { sandbox = sinon.createSandbox(); });
afterEach(() => { sandbox.restore(); });
it('fetches user from API', async () => {
const stub = sandbox.stub(api, 'get').resolves({ name: 'Alice' });
const user = await userService.getUser(1);
expect(user.name).to.equal('Alice');
expect(stub.calledOnce).to.be.true;
});
});
```
### Async Testing
```javascript
it('should fetch data', async () => {
const data = await fetchData();
expect(data).to.have.property('id');
});
it('callback style', (done) => {
fetchData((err, data) => {
expect(err).to.be.null;
done();
});
});
```
### Anti-Patterns
| Bad | Good | Why |
|-----|------|-----|
| Missing `done()` | Use async/await | Hanging tests |
| No sandbox | `sinon.createSandbox()` | Stubs leak |
| Arrow in `describe` | Regular function for `this.timeout()` | Context |
## Quick Reference
| Task | Command |
|------|---------|
| Run all | `npx mocha` |
| Watch | `npx mocha --watch` |
| Grep | `npx mocha --grep "login"` |
| Timeout | `npx mocha --timeout 10000` |
| Recursive | `npx mocha --recursive` |
## Setup: `npm install mocha chai sinon --save-dev`
## Deep Patterns → `reference/playbook.md`
| § | Section | Lines |
|---|---------|-------|
| 1 | Production Configuration | mocharc, NYC coverage, TypeScript |
| 2 | Testing with Chai + Sinon | Stubs, spies, assertions |
| 3 | Advanced Sinon Patterns | Fake timers, nock HTTP, sequential |
| 4 | Async Patterns | Promise, await, callback, events |
| 5 | Hooks & Test Organization | Lifecycle, nesting, grep tags |
| 6 | Custom Reporters & Plugins | Reporter class, root hooks |
| 7 | Express/API Testing | Supertest integration |
| 8 | CI/CD Integration | GitHub Actions, services |
| 9 | Debugging Quick-Reference | 10 common problems |
| 10 | Best Practices Checklist | 13 items |
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!