Outils pour utilisateurs

Outils du site


developpement:dotnet:moq:toc

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);
developpement/dotnet/moq/toc.txt · Dernière modification : 2022/02/02 00:42 de 127.0.0.1