Ce projet contient des tests unitaires complets utilisant :
- xUnit : Framework de test
- Moq : Mocking des dépendances (Base de données)
- FluentAssertions : Assertions lisibles
TableMasterApi.Tests/
├── Fixtures/
│ └── JwtConfigFixture.cs # Configuration JWT et données de test
├── Services/
│ └── JwtServiceTests.cs # Tests du service JWT
├── Controllers/
│ └── UserControllerTests.cs # Tests du contrôleur utilisateur
└── TableMasterApi.Tests.csproj # Fichier projet de test
- ✅ Extraction du token du header
Authorization - ✅ Génération de tokens JWT valides
- ✅ Inclusion des claims utilisateur dans le token
- ✅ Vérification de l'expiration (5 minutes)
- ✅ Extraction de l'UserId du token
- ✅ Gestion des tokens invalides
- ✅ Génération de refresh tokens
- ✅ Unicité des refresh tokens
Exemple de test :
[Fact]
public void GenerateAccessToken_WithValidUserId_ShouldCreateValidJwt()
{
// Arrange
long userId = 123;
// Act
var token = _jwtService.GenerateAccessToken(userId);
// Assert
token.Should().NotBeNullOrEmpty();
var jwtToken = handler.ReadToken(token) as JwtSecurityToken;
jwtToken.Issuer.Should().Be(_fixture.JwtConfig.Issuer);
}- ✅ Récupération d'un utilisateur par ID
- ✅ Gestion des utilisateurs inexistants (404)
- ✅ Gestion des erreurs de base de données (500)
- ✅ Création d'utilisateur
- ✅ Validation des données
- ✅ Intégration avec JWT
_mockUserDAL
.Setup(dal => dal.GetUserById(userId))
.ReturnsAsync(testUser);
_mockUserDAL
.Setup(dal => dal.GetUserById(999))
.ReturnsAsync((UserOut)null!);Exemple de test :
[Fact]
public async Task GetUserById_WithValidIdAndAuthorization_ShouldReturnOkWithUser()
{
// La base de données est mockée - aucune connexion réelle n'est effectuée
var result = await controller.GetUserById(userId);
var okResult = result.Result as OkObjectResult;
okResult.StatusCode.Should().Be(200);
}# Aller au répertoire du projet
cd /home/maxence/Dev/TableMaster/TableMasterApi
# Exécuter tous les tests
dotnet test
# Exécuter les tests avec verbosité
dotnet test --verbosity normal
# Exécuter un fichier de test spécifique
dotnet test TableMasterApi.Tests/Services/JwtServiceTests.cs
# Exécuter un test spécifique
dotnet test --filter "JwtServiceTests.GenerateAccessToken_WithValidUserId_ShouldCreateValidJwt"- Ouvrir la palette de commandes :
Ctrl+Shift+P - Taper : "Test: Run All Tests"
- Ou cliquer sur "Run All Tests" en haut du fichier de test
- Ouvrir Test Explorer :
Ctrl+E, T - Sélectionner les tests à exécuter
- Cliquer sur "Run"
- 3 tests d'extraction du token
- 4 tests de génération d'access token
- 3 tests d'extraction d'UserId
- 3 tests de refresh token
- 4 tests de GetUserById
- 2 tests de CreateUser
- 3 tests d'intégration avec JWT
Total : 23 tests unitaires
[Fact]
public void TestMethod()
{
// Arrange - Préparation
var data = new TestData();
// Act - Exécution
var result = SomeMethod(data);
// Assert - Vérification
result.Should().Be(expectedValue);
}[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData("invalid")]
public void TestMultipleCases(string input)
{
// Même test exécuté avec différentes données
}_mockUserDAL
.Setup(dal => dal.GetUserById(It.IsAny<long>()))
.ReturnsAsync(testUser);_mockUserDAL.Verify(dal => dal.GetUserById(userId), Times.Once);// TableMasterApi.Tests/Controllers/RestaurantControllerTests.cs
public class RestaurantControllerTests
{
[Fact]
public async Task MyTest()
{
// Arrange
var mockDAL = new Mock<RestaurantDAL>();
// Act
// Assert
}
}public class MyTests : IClassFixture<JwtConfigFixture>
{
private readonly JwtConfigFixture _fixture;
public MyTests(JwtConfigFixture fixture)
{
_fixture = fixture;
}
}var mockDAL = new Mock<SomeDAL>();
mockDAL.Setup(x => x.GetData()).ReturnsAsync(testData);✅ À Faire :
- Un test = une seule responsabilité
- Noms de tests explicites (
GetUserById_WithValidId_ShouldReturnOk) - Utiliser les fixtures pour partager la configuration
- Vérifier les appels aux mocks
- Tester les cas d'erreur
❌ À Éviter :
- Tests qui dépendent les uns des autres
- Tests trop complexes (>20 lignes)
- Appels réels à la base de données
- Assertions vagues (
result.Should().NotBeNull()) - Secrets hardcodés dans les tests
# Nettoyer et rebâtir
dotnet clean
dotnet build# Vérifier que le chemin du ProjectReference est correct dans .csproj
dotnet restoreC'est normal ! Les tests utilisent des mocks, pas la vraie DB. Vérifiez que :
- ✅ Le mock est correctement configuré
- ✅
Setup()est appelé avant l'utilisation du mock - ✅ Vous utilisez
.ReturnsAsync()pour les méthodes async
Créé le: 7 mai 2026 Framework: xUnit + Moq + FluentAssertions