Pour une utilisation en .NET Core 2.x de NUNit, voir cette documentation.
Nuget Packages:
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.
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);
bool isValid = true; mockValidator.Setup(x => x.IsValid(It.IsAny<string>(), out isValid));
mockValidator.Setup(x => x.LicenseKey).Returns("EXPIRED");
mockValidator.Setup(x => x.LicenseKey).Returns(GetLicenseKeyExpiryString);
string GetLicenseKeyExpiryString() { return "EXPIRED"; }
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");
mockValidator.DefaultValue = Default.Mock;
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();
Il y a deux modes de MockBehavior
: Strict
et Loose
:
Setup()
.Setup()
.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.
Nuget Package : FluentAssertions.
Exemple:
decision.Should().Be(CreditCardApplicationDecision.AutoAccepted);