Fonctions C # encore plus prises en charge dans Telerik JustMock R3 2018
La version de JustMock R3 est maintenant opérationnelle, apportant un support pour les fonctionnalités C # 7 "Valeurs de retour ref et locus ref", "Fonctions locales" ainsi que "Paramètres nommés" et moquage de propriétés non publiques.
vous avez eu du mal à tester une méthode qui renvoie une référence, ou la fonction locale définie dans une méthode, alors c'est l'article que vous devriez lire. Lisez la suite pour voir tout ce qui est nouveau dans la publication Telerik JustMock R3 2018.
Valeurs de retour de référence et locaux de référence
Si vous avez suivi le développement du langage C # "Ref retourne les valeurs et les locaux de ref." Tester cette fonctionnalité dans le code est souvent liée à la lutte de mot. La version R3 2018 rend les tests aussi simples que l'écriture de plusieurs lignes de code. Considérez les méthodes suivantes qui doivent être testées:
internal class Foo
{
private static int [] tableau = {1, 2, 3, 4, 5, 6};
] public ref int GetRefReturnInstanceWithArgs ( ref int p)
[
ref int local = ref array [0];
local + = p;
retour ref local;
} [19659002]
privé statique ref int GetRefReturnPrivateStaticWithArgs ( ref [19659006] int p)
[
ref int [19659007] local = ref array [0];
local + = p;
]
retour ref local;
[19659002] }
Une des parties intrigantes du test de ce code est la façon dont une valeur considérée comme un retour de référence peut être créée et renvoyée à la place de la valeur d'origine. JustMock introduit un délégué dédié à la gestion d'un tel scénario et une classe d'assistance LocalRef qui simplifie son utilisation. Vérifiez le code suivant pour voir un exemple de test de la manière dont la valeur de retour ref est créée et utilisée:
[TestMethod]
public void MockRefReturnInstanceMethodWithArgs ()
]
// Disposition
int Valeur attendue = 12;
var sut = Mock.Create
LocalRefHandle < int [19659084]> localRef = LocalRef.WithValue (expectValue);
Mock.Arrange (sut, s => s.GetRefReturnInstanceWithArgs ( ref Arg.Ref (Arg.AnyInt) .Value))
.Returns (localRef.Handle)
.OccursOnce ();
// Acte
int param = 10;
ref int resultat = ref sut.GetRefReturnInstanceWithArgs ( ref param) ;
// Assert
.Assert (sut);
Assert.Equal (Valeur attendue, résultat);
} [19659069] Et qu'en est-il lorsque la méthode est privée ou même privée statique? Il devrait être beaucoup plus difficile de le tester, non? Pas du tout.
Nous suivons l'approche déjà connue consistant à simuler des API non publiques avec l'attente Mock.NonPublic. Mais pour éviter toute confusion sur la méthode d'arrangement exacte dans l'attente non publique, nous avons extrait la logique requise dans une interface distincte nommée INonPublicRefReturnExpectation.
Consultez l'exemple de test suivant:
[TestMethod]
public void MockRefReturnPrivateStaticMethodWithArgs ()
]
// Disposition
int Valeur attendue = 12;
Mock.SetupStatic
LocalRefHandle < int > localRef = LocalRef.WithValue (expectedValue);
Mock.NonPublic.RefReturn.Arrange <Foo, int > ( " GetRefReturnPrivateStaticWithArgs "ArgExpr.Ref (1))
.Returns (localRef.Handle)
[19659032] .OccursOnce ();
// Acte
] var privateAccessor = Mock.NonPublic.MakeStaticPrivateAccessor ( typeof (Foo));
int param = 10 ;
ref int res = ref privateAccessor.RefReturn.CallMethod < int > ( "GetRefReturnPrivateStaticWithArgs" Arg.Ref (param) .Value);
// Assert
Mock.Assert
Assert.Equal ( expectedValue, res);
} [19659069] Comme je l'ai dit, plusieurs lignes de code pour un test suivant le schéma de test Arrange, Act, Assert (AAA) et la lutte sont terminées. Si vous avez besoin de plus d'informations, vous pouvez consulter notre article sur le sujet .
Fonctions locales
Fonctions locales est une autre fonctionnalité du langage C # que les développeurs sont impatients d'utiliser il. Mais alors ils font un pas en arrière après avoir trébuché sur la question de "comment tester une fonction locale?" La raison est simple. Jusqu'à présent, il n'existait aucun moyen efficace et maintenable de tester les fonctions locales.
Telerik JustMock est désormais le premier outil qui prend en charge le test et la simulation des fonctions locales de manière fiable. Maintenant à la partie plus pratique. Comment exactement je peux écrire mes tests? Considérez la classe suivante qui doit être testée:
interne classe Foo
[
public int GetResult ()
retour [19659007] 100 + GetLocal ();
int GetLocal ()
{
retour 42;
}
}
}
Pour simuler cette fonction locale simple, j'aurais besoin d'informations sur le nom de la classe, le nom o f la méthode du propriétaire et le nom de la fonction locale. Voici à quoi ressemblerait le test:
[TestMethod]
public néant TestBasicScenario ()
]
// Disposition
var sut = Mock.Create
Mock.Local.Function.Arrange < int > (sut, "GetResult" [19659137] "GetLocal" ). DoNothing ();
// Act
var result = sut.GetResult ();
// Assert
Assert.AreEqual (100, résultat);
}
Vous pouvez voir que la maquette est créée avec le comportement d'origine de l'appel. Cela est nécessaire pour que la méthode propriétaire GetResult exécute le code d'origine.
C'était le cas le plus élémentaire, mais qu'en est-il si une surcharge qui prend des paramètres et possède également une fonction locale est ajoutée ultérieurement au code? Considérez la surcharge suivante:
public int GetResult ( int param)
{
retour param + 100 + GetLocal ();
int GetLocal () [19659002] [
retour 200;
}
}
Bien, dans ce cas, un autre test devrait être écrit pour la seconde surcharge avec des informations sur les types de ses paramètres. Voici à quoi ressemblerait le test:
[TestMethod]
public néant MockGetResultParams ()
]
// Disposition
var sut = Mock.Create
Type [] containsMethodParamTypes = nouveau Type [] { typeof ( int )
Mock.Local.Function.Arrange < int > (sut, "GetResult" [19659084]containsMethodParamTypes, "GetLocal" ). Retourne (42);
// Loi
var resultParams = sut.GetResult (10);
// Assert
Assert.AreEqual (42, resultParams);
}
JustMock prend désormais en charge l'exécution directe d'une fonction locale. Utilisez simplement la méthode Call dans l'interface IFunctionExpectation. Considérez la classe suivante qui doit être testée:
interne classe Foo
{
privée bool IsEven ( valeur int )
[
bool isEven = (valeur% 2 == 0)? true : false ;
retourner isEven;
}
public void Méthode ()
{19459013]
bool resultat = LocalFunction (10);
] bool LocalFunction ( int ))
[
retourner IsEven (valeur);
[19659024]}
}
Et voici à quoi ressemblerait le test:
[TestMethod]
public néant CallLocal ()
[ ]
// Disposition
var sut = Mock.Create
Mock.NonPublic.Arrange < bool > (sut, "IsEven" ). false )
// Acte
] var result = Mock.Local.Function.Call (sut, "Method" "LocalFunction" 14); [19659002]
// Assert
Assert.Equal ( false résultat);
}
Si vous vous posez la question, JustMock prend également en charge les fonctions locales utilisées dans méthodes et classes privées et statiques. Pour plus d'informations, consultez notre article de documentation .
Mocking non-Public Property Setters
Si vous avez utilisé une solution de contournement désagréable pour simuler un setter de propriété non-public . Vous pouvez le supprimer en toute sécurité. Nous avons introduit la méthode ArrangeSet dans l'interface INonPublicExpectation accessible via la classe Mock pour vous aider à tester ces paramètres privés. Jetez simplement un coup d'œil à l'exemple de test suivant pour mieux comprendre le concept.
Voici la propriété privée qui serait testée:
public class Foo
[
privé int Index { get ; set ; }
}
Et voici à quoi devrait ressembler le test:
[TestMethod]
public néant MockNonPublicPropArrangeSet ()
]
// Disposition
int AttenduValue = 20;
var sut = Mock.Create
var privateAccessor = Mock .NonPublic.MakePrivateAccessor (sut);
Mock.NonPublic.ArrangeSet (sut, "Index" 12) .DoInstead (( ) => privateAccessor.SetProperty ( "Index" Valeur attendue));
// Loi
[19659024] privateAccessor.SetProperty ( "Index" 12);
int res = ( int ]) privateAccessor.GetProperty ( "Index" );
// Assert
Assert.Equal (expectedValue, res);
}
Paramètres nommés
Paramètres nommés a été une fonctionnalité de C # depuis longtemps maintenant et il est très populaire parmi les développeurs. Par conséquent, il y a quelque temps, nous avons introduit la prise en charge des méthodes d'instance moqueuses acceptant les paramètres nommés. Mais nous n'avions pas implémenté le support des méthodes statiques moqueuses acceptant des paramètres nommés. C'est maintenant chose faite, et c'est aussi simple que d'arranger une méthode statique normale. Vérifiez l'exemple de test suivant:
Voici la classe et la méthode à tester.
internal class Foo
{ [19659002] public static void StaticAction ( int param1 = 0, int param2 = 0, int param3 = 0)
lance new Exception non implémentée ();
}
Et voici ce que le le test devrait ressembler à:
[TestMethod]
public void TestStaticMethodAcceptingNamedParameters ()
]
// Disposition
Mock.SetupStatic
Mock.Arrange [19659002]
// Acte
Foo.StaticAction (3, 2);
// Assert
Mock. Assert
}
Découvrez la dernière ve
Assurez-vous d'essayer la dernière version de JustMock et de nous contacter avec vos commentaires . Il est déjà disponible pour téléchargement sur votre compte.
Pas un client JustMock? N'hésitez pas à télécharger une version d'évaluation gratuite de 30 jours .
Lancez ma version d'évaluation JustMock
Visionnez les webinaires de publication R3
notre nouveau communiqué en action, veuillez vous joindre à nous pour le webinaire Telerik UI R3 2018 le 2 octobre 2018 à 11 heures.
Source link
