Table des matières
NUnit
Pour une utilisation en .NET Core 2.x de NUNit, voir cette documentation.
Nuget Packages:
- NUnit
- NUnit3TestAdapter
- Microsoft.NET.Test.Sdk
Moq
Nuget Package: Moq
Un Test Double est un terme générique pour désigner un élément de production dans l'objectif de tester1)
Il y a cinq types de test double : Fakes, Dummies, Stubs, Mocks et Spies. Voir Dummy, Fake, Stub, Mock et Spy, les tests unitaires avec l’aide de Moq pour plus de détails.
using Moq; Mock<IFrequentFlyerNumberValidator> mockValidator = new Mock<IFrequentFlyerNumberValidator>();
Utilisation:
var sut = new CreditCardApplication(mockValidator.Object);
Pour mocker, on doit avoir une interface, une classe abstraite, ou une class non-sealed.
Setup des méthodes mockées
On peut spécifier ce qu'une méthode peut accepter, et ce qu'elle doit retourner:
mockValidator.Setup(x => x.IsValid("x")).Returns(true);
ou bien
mockValidator.Setup(x => x.IsValid(It.IsAny<string>())).Returns(true);
Un autre exemple, la méthode retournera true
si l'argument de IsValid()
commence par x
:
mockValidator.Setup(x => x.IsValid(It.Is<string>(number => number.StartsWith("x")))).Returns(true);
mockValidator.Setup(x => x.IsValid(It.IsIn("x", "y", "z"))).Returns(true); mockValidator.Setup(x => x.IsValid(It.IsInRange("b", "z", Range.Inclusive))).Returns(true);
Out parameter
bool isValid = true; mockValidator.Setup(x => x.IsValid(It.IsAny<string>(), out isValid));
Mocker les propriétés
mockValidator.Setup(x => x.LicenseKey).Returns("EXPIRED");
Par une fonction
mockValidator.Setup(x => x.LicenseKey).Returns(GetLicenseKeyExpiryString);
string GetLicenseKeyExpiryString() { return "EXPIRED"; }
Propriétés imbriquées
Si on a cette définition de IFrequentFlyerNumberValidator
:
namespace CreditCardApplications { public interface ILicenseData { string LicenseKey { get; } } public interface IServiceInformation { ILicenseData License { get; set; } } public interface IFrequentFlyerNumberValidator { bool IsValid(string frequentFlyerNumber); void IsValid(string frequentFlyerNumber, out bool isValid); IServiceInformation ServiceInformation { get; } } }
On peut faire ceci :
var mockValidator = new Mock<IFrequentFlyerNumberValidator>(); var mockLicenseData = new Mock<ILicenseData>(); mockLicenseData.Setup(x => x.LicenseKey).Returns("EXPIRED"); var mockServiceInfo = new Mock<IServiceInformation>(); mockServiceInfo.Setup(x => x.License).Returns(mockLicenseData.Object); mockValidator.Setup(x => x.ServiceInformation).Returns(mockServiceInfo.Object);
ou simplement :
mockValidator.Setup(x => x.ServiceInformation.License.LicenseKey).Returns("EXPIRED");
Valeurs de retour par défaut
- Reference types : null
mockValidator.DefaultValue = Default.Mock;
Track changes to mock property values
Par défaut, Moq ne retient pas les changements aux propriétés mockées.
_validator.ValidationMode = application.Age >= 30 ? ValidationMode.Detailed : ValidationMode.Quick;
On doit donc faire un setup de propriété:
mockValidator.SetupProperty(x => x.ValidationMode);
Pour toutes les propriétés:
mockValidator.SetupAllProperties();
Verify
MockBehavior
Il y a deux modes de MockBehavior
: Strict
et Loose
:
- Strict: Lance une exception si une méthode a été appelée, mais qu'elle n'a pas de
Setup()
. - Loose: Mode par défaut, ne lancera pas d'exceptions si une méthode est appelée et qu'elle n'a pas de
Setup()
. - Default: C'est le mode par défaut, ce qui est équivalent à
MockBehavior.Loose
.
On suggère d'utiliser des mocks stricts seulement quand c'est nécessaire et préférer des mocks loose dans les autres cas.
FluentAssertions
Nuget Package : FluentAssertions.
Exemple:
decision.Should().Be(CreditCardApplicationDecision.AutoAccepted);