Table des matières

NUnit

Pour une utilisation en .NET Core 2.x de NUNit, voir cette documentation.

Nuget Packages:

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

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 :

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);