mcpbeat

Mocha Skill

lambdatest/mocha-skill

> Generates Mocha tests in JavaScript with Chai assertions and Sinon mocking. Use when user mentions "Mocha", "Chai", "sinon", "describe/it (not Jest)".

5k tokens
context cost
the whole folder, loaded on every use
3
files
instructions only
0
copies elsewhere
how many repositories repackaged it
343
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/LambdaTest/agent-skills --skill mocha-skill

The instruction itself

10 sections, as written by the author

Mocha Testing Skill

Core Patterns

Basic Test with Chai

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

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

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

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 |

How to use it

Copy the folder

Take lambdatest/mocha-skill from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.

Install what it needs

The instructions reference npm, npx. Without those the skill loads but fails at the first command.