Testing
Flo uses NUnit for backend testing and Jasmine/Karma for frontend testing, with automated coverage reporting via GitHub Actions.
Backend Testing (NUnit + Moq)
Quick Start
# Run all tests
dotnet test Flo.BE.Tests
# Run with coverage report
./run-coverage.sh --open
Stats
| Metric | Value |
|---|---|
| Framework | NUnit with Moq |
| Test count | 438+ (1035+ with preference tests) |
| Line coverage | 63% |
| Branch coverage | 41.9% |
| Method coverage | 68.8% |
| Excludes | Migrations, generated code, Program.cs |
Test Structure
Flo.BE.Tests/
├── Services/
│ ├── AuthServiceTests.cs
│ ├── BookingServiceTests.cs
│ └── ...
├── BoundedContexts/
│ └── Immobili/
│ └── Services/
│ ├── ImmobilePreferenceServiceTests.cs
│ └── ImmobileMatchingServiceTests.cs
└── Controllers/
└── ...
Test Pattern
[TestFixture]
public class BookingServiceTests
{
private Mock<IBookingRepository> _mockRepo;
private BookingService _service;
[SetUp]
public void SetUp()
{
_mockRepo = new Mock<IBookingRepository>();
_service = new BookingService(_mockRepo.Object);
}
[Test]
public async Task CreateBooking_ValidRequest_ReturnsSuccess()
{
// Arrange
var dto = new CreateBookingDto(1, DateTime.Now, "Notes");
// Act
var result = await _service.CreateAsync(dto);
// Assert
Assert.That(result, Is.Not.Null);
_mockRepo.Verify(x => x.AddAsync(It.IsAny<Booking>()), Times.Once);
}
[TestCase("[email protected]", true)]
[TestCase("", false)]
public void ValidateEmail_ReturnsExpected(string email, bool expected)
{
var result = _service.IsValidEmail(email);
Assert.That(result, Is.EqualTo(expected));
}
}
Rules
- Use NUnit (
[Test],[SetUp],[TearDown],Assert.That()) — never xUnit - Use Moq for mocking dependencies
- All backend services require unit tests
- Follow Arrange-Act-Assert pattern
Frontend Testing
cd Flo.FE
ng test
Uses Jasmine/Karma with Angular TestBed. All components use OnPush change detection, which must be accounted for in tests.
CI/CD
Code Coverage
GitHub Actions runs coverage every 15 days:
- Executes
dotnet testwith coverage collection - Publishes report to Codecov
- Badge displayed in README
i18n Check
CI validates that it.json and en.json have matching translation keys. Fails if any key is missing from either file.
Docker Build
On push to master or develop:
- Builds Docker image
- Publishes to GitHub Container Registry
- Tags:
latest(master),develop-latest(develop),<branch>-<commit>(all)