vendredi 5 février 2010 13:49
tja
[Tests] BDD et la Suite des tests unitaires avec MSpec
Je continue cette série de posts concernant les frameworks des test unitaires dans le développement BDD. Cette fois ci j’ai essayé MSpec que je ne connaissais pas très bien. Vous pouvez lire les postes précédents qui traitement des tests unitaires façon BDD:
[Tests] ASP.NET MVC 2 et les Tests Unitaires avec NBehave
[Tests] ASP.NET MVC 2 et les Tests Unitaires avec NBehave – Suite
[Tests] Ma quête BDD continue. Tests Unitaires avec SpecFlow
Dans ce poste je vais également partir du même exemple (template par défaut de ASP.NET MVC 2) afin que vous puissiez comparer les différents frameworks des test unitaires BDD. Cette fois-ci je vais utiliser MSpec (machine.Specifications) qui est un framework de tests dont le but est de purifier et simplifier le code des tests. En fait plutôt que d’utiliser les méthodes et les attributs, MSpec utilise les délégués et les méthodes anonymes, cela bien évidement doit rendre votre code plus lisible. De plus, chose importante, une pleine intégration avec ReSharper 4.5 et 5.0.
Pour commencer vous pouvez télécharger Mspec :
Dans la version binaire vous avez l’installateur pour ReSharper. La syntaxe de MSpec est très simple. Tout ce que vous devez savoir sont les trois mots clés:
Le code de test de notre controlleur ASP.NET MVC est très simple donc je pense qu’une description détaillée n’est pas nécessaire (cependant laissez-moi un commentaire si vous voulez connaître les détails):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
public class AccountControllerTests3 { protected static AccountController controller; static IFormsAuthenticationService formsService; static IMembershipService membershipService; protected static ActionResult result; protected static LogOnModel model;
Establish context = () => { var controllerBuilder = new TestControllerBuilder();
formsService = MockRepository.GenerateStub<IFormsAuthenticationService>(); membershipService = MockRepository.GenerateStub<IMembershipService>(); model = MockRepository.GenerateStub<LogOnModel>();
controller = new AccountController(formsService, membershipService); controllerBuilder.InitializeController(controller);
};
Because user_logs = () => { bool rememberMe = false;
membershipService.Stub( x => x.ValidateUser("bdd", "mspec")).Return(true); formsService.Stub(x => x.SignIn("bdd", rememberMe));
controller.ModelState.IsValid.ShouldBeTrue(); }; }
[Subject(typeof(AccountController), "LogInTests")] public class When_logging_into_application_with_good_login_and_password : AccountControllerTests3 { private It user_should_be_redirected_to_the_home_page = () => { model.UserName = "bdd"; model.Password = "mspec";
result = controller.LogOn(model, string.Empty);
result.AssertActionRedirect().ToAction<HomeController>( x => x.Index()); }; }
[Subject(typeof(AccountController), "LogInTests")] public class When_logging_into_application_with_bad_login_and_password : AccountControllerTests3 { It The_error_message_should_be_shown = () => { model.UserName = "BAD"; model.Password = "BAD";
result = controller.LogOn(model, string.Empty);
controller.ModelState[""].Errors[0].ErrorMessage.ShouldEqual( "The user name or password provided is incorrect."); }; }
|
Si on exécute nos tests dans ReSharper test runner nous obtenons le résultat suivant :
Personnellement je ne sais pas si le code écrit est plus clean. Cela peut dépendre des cas. MSpec est une alternative intéressante mais pour le moment mon outils préféré reste quand même SpecFlow. Si parmi vous il y a des pros de MSpec, n’hésitez pas à me faire un retour pour améliorer mon test ou le réécrire. En tout cas c’est un outils intéressant dont je vais suivre l’évolution.
A bientôt,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :