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