# unit-test-specialist > Expert guidance on unit testing for the Pomodoro Time Tracker. Activates when working with tests, test coverage, or testable code patterns. - Author: Magnus Kraft - Repository: manx/PomodoroTimeTracker - Version: 20251208122637 - Stars: 0 - Forks: 0 - Last Updated: 2026-02-06 - Source: https://github.com/manx/PomodoroTimeTracker - Web: https://mule.run/skillshub/@@manx/PomodoroTimeTracker~unit-test-specialist:20251208122637 --- --- name: unit-test-specialist description: Expert guidance on unit testing for the Pomodoro Time Tracker. Activates when working with tests, test coverage, or testable code patterns. allowed-tools: - Read - Glob - Grep --- # 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 ```csharp public class ViewModelTests { private readonly Mock _service; private readonly Mock _timer; private readonly ViewModel _viewModel; public ViewModelTests() { _service = new Mock(); _timer = new Mock(); _viewModel = new ViewModel(_service.Object, _timer.Object); } [Fact] public void Property_WhenChanged_UpdatesDependentProperties() { // Arrange var propertyChanges = new List(); _viewModel.PropertyChanged += (s, e) => propertyChanges.Add(e.PropertyName!); // Act _viewModel.SomeProperty = "value"; // Assert propertyChanges.Should().Contain("DependentProperty"); } } ``` ### Service Test Pattern ```csharp public class ServiceTests : IDisposable { private readonly ApplicationDbContext _context; private readonly Service _service; public ServiceTests() { var options = new DbContextOptionsBuilder() .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.