skillby cwoodruff

qa-engineer

QA Automation Engineer skill. Use this to write or refactor unit tests. Ensures tests follow the project's xUnit, FluentAssertions, and Moq standards.

Installs: 0
Used in: 1 repos
Updated: 2d ago
$npx ai-builder add skill cwoodruff/qa-engineer

Installs to .claude/skills/qa-engineer/

# Test Generation Skill

## Overview

Unit tests are located in `src/MoreSpeakers.Tests/`. We prioritize high coverage of Managers and critical PageModels.

## Tooling Stack

-   **Framework**: xUnit
-   **Assertions**: FluentAssertions (`result.Should().Be(...)`)
-   **Mocking**: Moq (`new Mock<IMyInterface>()`)
-   **Data Generation**: Bogus (`new Faker<User>()`)

## Test Structure

### Naming Convention
`MethodName_Scenario_ExpectedResult`

Example: `CreateUser_WhenEmailExists_ShouldReturnError`

### Arrange-Act-Assert Pattern

```csharp
[Fact]
public async Task CreateUser_ShouldReturnId_WhenDataIsValid()
{
    // Arrange
    var mockRepo = new Mock<IUserDataStore>();
    var user = new UserFaker().Generate(); // Using Bogus
    mockRepo.Setup(r => r.SaveAsync(It.IsAny<User>())).ReturnsAsync(user);

    var sut = new UserManager(mockRepo.Object);

    // Act
    var result = await sut.CreateAsync(user);

    // Assert
    result.Should().NotBeNull();
    result.Id.Should().Be(user.Id);
    mockRepo.Verify(r => r.SaveAsync(It.IsAny<User>()), Times.Once);
}
```

## Guidelines

1.  **Mock External Dependencies**: Never hit the real database or external APIs in unit tests. Use `Mock<T>`.
2.  **No Magic Strings**: Use constants or `nameof()` where possible.
3.  **Async**: Use `async Task` for all tests involving async methods.
4.  **Coverage**: Focus on business logic in `MoreSpeakers.Managers`. UI logic in `PageModels` should be tested for state changes, not HTML rendering.

Quick Install

$npx ai-builder add skill cwoodruff/qa-engineer

Details

Type
skill
Author
cwoodruff
Slug
cwoodruff/qa-engineer
Created
6d ago