Files
2025-02-02 14:10:51 -05:00

2.6 KiB

Discord Bot Testing Guide

Setup

The project uses Jest for testing with the following configuration:

  • Unit tests for commands and utilities
  • Mocked Discord.js components
  • 100% code coverage tracking
  • Automated test running

Test File Patterns

Only files matching these patterns are treated as test files:

  • **/__tests__/**/*.test.[jt]s?(x)
  • **/__tests__/**/*.spec.[jt]s?(x)
  • **/?(*.)+(spec|test).[jt]s?(x)

Helper files (like testUtils.js) should not use these patterns to avoid being treated as test files.

Running Tests

# Run all tests
npm test

# Run tests in watch mode
npm run test:watch

# Run tests with coverage report
npm run test:coverage

Test Structure

Test Utilities (__tests__/utils/testUtils.js)

  • createMockInteraction(): Creates mock Discord.js interactions for testing commands
  • createMockClient(): Creates mock Discord.js client instances

Command Tests (__tests__/commands/)

Each command has its own test file that verifies:

  • Command structure (name, description, options)
  • Command execution
  • Error handling
  • Edge cases

Writing New Tests

  1. Create test files in the __tests__ directory following the naming convention *.test.js
  2. Use the provided test utilities to mock Discord.js components
  3. Structure tests using describe/it blocks for clarity
  4. Test both success and error cases
  5. Ensure proper cleanup in beforeEach/afterEach blocks if needed

Example Test Structure

const { createMockInteraction } = require('../utils/testUtils');

describe('Command Name', () => {
  describe('Command Structure', () => {
    // Test command properties
  });

  describe('Command Execution', () => {
    let interaction;

    beforeEach(() => {
      interaction = createMockInteraction({
        // Custom options
      });
    });

    it('should handle successful execution', async () => {
      // Test success case
    });

    it('should handle errors', async () => {
      // Test error case
    });
  });
});

Best Practices

  1. Mock external dependencies
  2. Test edge cases and error conditions
  3. Keep tests focused and isolated
  4. Use descriptive test names
  5. Maintain test coverage above 90%
  6. Clean up resources after tests
  7. Use appropriate assertions
  8. Test asynchronous code properly
  9. Keep utility files separate from test files
  10. Follow proper naming conventions for test files

Coverage Reports

Coverage reports are generated in the coverage directory after running:

npm run test:coverage

The report includes:

  • Statement coverage
  • Branch coverage
  • Function coverage
  • Line coverage