unit-test-specialist

manx's avatarfrom manx

Expert guidance on unit testing for the Pomodoro Time Tracker. Activates when working with tests, test coverage, or testable code patterns.

⭐0stars🔀0forks📁View on GitHub🕐Updated Dec 8, 2025

When & Why to Use This Skill

This Claude skill provides expert-level guidance for unit testing within the Pomodoro Time Tracker ecosystem. It specializes in .NET 9 testing frameworks including xUnit, Moq, and FluentAssertions, helping developers implement the AAA (Arrange-Act-Assert) pattern and maintain high test coverage across ViewModels, Services, and Repositories.

Use Cases

  • Generating robust unit tests for ViewModels to verify PropertyChanged notifications and dependency interactions using Moq.
  • Setting up service-layer integration tests using EF Core InMemory database to validate business logic and repository patterns.
  • Ensuring code quality and reliability by auditing test coverage against project targets (5-8 tests per public method) and maintaining a 100% pass rate.
nameunit-test-specialist
descriptionExpert guidance on unit testing for the Pomodoro Time Tracker. Activates when working with tests, test coverage, or testable code patterns.

Unit Test Specialist

Activates when: Tests, unit tests, test coverage, or testable code mentioned.

Shared Testing Guidelines

@/.claude/prompts/dotnet/testing/aaa-pattern.md @/.claude/prompts/dotnet/testing/test-naming.md @/.claude/prompts/dotnet/testing/moq-cheatsheet.md @/.claude/prompts/dotnet/testing/fluentassertions.md


Project-Specific

Framework Stack

  • xUnit - Primary test framework (.NET 9)
  • Moq - Mocking for interfaces
  • FluentAssertions - Readable assertions
  • EF Core InMemory - Repository testing

Test Structure (377 tests)

PomodoroTimeTracker.Tests/
├── ViewModels/                    (158 tests)
│   ├── PomodoroViewModelTests.cs     (60)
│   ├── RegularTimerViewModelTests.cs (40)
│   ├── StopWatchViewModelTests.cs    (30)
│   └── ...
├── Application/Services/          (148 tests)
│   ├── PomodoroSessionServiceTests.cs
│   ├── AudioServiceTests.cs          (35)
│   └── ...
└── Infrastructure/Repositories/   (71 tests)

ViewModel Test Pattern

public class ViewModelTests
{
    private readonly Mock<IService> _service;
    private readonly Mock<IDispatcherTimer> _timer;
    private readonly ViewModel _viewModel;

    public ViewModelTests()
    {
        _service = new Mock<IService>();
        _timer = new Mock<IDispatcherTimer>();
        _viewModel = new ViewModel(_service.Object, _timer.Object);
    }

    [Fact]
    public void Property_WhenChanged_UpdatesDependentProperties()
    {
        // Arrange
        var propertyChanges = new List<string>();
        _viewModel.PropertyChanged += (s, e) => propertyChanges.Add(e.PropertyName!);

        // Act
        _viewModel.SomeProperty = "value";

        // Assert
        propertyChanges.Should().Contain("DependentProperty");
    }
}

Service Test Pattern

public class ServiceTests : IDisposable
{
    private readonly ApplicationDbContext _context;
    private readonly Service _service;

    public ServiceTests()
    {
        var options = new DbContextOptionsBuilder<ApplicationDbContext>()
            .UseInMemoryDatabase(Guid.NewGuid().ToString())
            .Options;
        _context = new ApplicationDbContext(options);
        _service = new Service(new UnitOfWork(_context));
    }

    public void Dispose()
    {
        _context.Database.EnsureDeleted();
        _context.Dispose();
    }
}

Coverage Targets

  • 5-8 tests per public method
  • Happy path + validation + edge cases
  • 100% pass rate required

Update TEST_SUMMARY.md

When tests are added/modified, update TEST_SUMMARY.md with current counts.