Mocking HttpContext.server.MapPath dans le test d’unité ASP.NET

J’ai travaillé dans les tests unitaires dans l’application Web ASP.Net. J’ai maintenant access à mon constructeur dans le fichier de modèle pour tester le code Server.MapPath permettant de télécharger mon fichier XML. je dois donc me moquer de Server.MapPath.

J’ai cherché beaucoup mais tous les échantillons donnés seulement pour Asp.NET MVC mais je travaille dans ASP.NET alors s’il vous plaît aider dans ASP.NET pour résoudre ce problème.

Mon code est donné ci-dessous.

public class NugetPlatformModel { public bool IsHavingLicense { get; set; } public List PlatformProduct = new List(); public NugetPlatformModel() { var xmldoc = new XmlDocument(); mldoc.Load(HttpContext.Current.Server.MapPath(@"~\Content\PlatformProducts.xml")); } } 

Et mon code de test unitaire

  [Test] public void Account_UnlicensedCustomerIdentity_IsStudioLicenseAndIshavinglicenseFalse() { //Act NugetPlatformModel nugetPlatformModel = new NugetPlatformModel(); //Assert AssertEquals(false, nugetPlatformModel.IsHavingLicense); } 

C’est typique avec du code qui appelle des méthodes statiques, il est très difficile de tester tout en préservant la séparation des préoccupations et en évitant les couplages étroits. Voici une approche générique pour tester et simuler un “code non testable”: écrivez-lui un “wrapper de façade”.

  • Créez un wrapper pour ces méthodes. Une classe simple qui contient des méthodes nommées de manière judicieuse et ne délègue que des delegates aux appels non testables (généralement des appels statiques)

  • Créer une interface pour cette classe wrapper

  • Au lieu d’appeler directement les méthodes non testables dans votre code client, utilisez l’encapsuleur (dépendance injectée à l’aide de l’interface fournie à l’étape 2) et appelez des méthodes normales.

  • Dans votre test unitaire, simulez le wrapper avec le comportement souhaité.

Cette approche réduit efficacement le couplage et sépare les problèmes à séparer. Bien sûr, vous ne pouvez toujours pas tester le comportement du wrapper lui-même, mais s’il est assez simple (déléguer uniquement aux appels d’origine), le problème n’est pas aussi grave.

Mettre à jour:

Utilisation de cales pour isoler votre application des autres assemblages pour les tests unitaires

Les types Shim sont l’une des deux technologies utilisées par Microsoft Fakes Framework pour vous permettre d’isoler facilement les composants testés de l’environnement. Shims dirige les appels vers des méthodes spécifiques vers le code que vous écrivez dans le cadre de votre test. De nombreuses méthodes renvoient des résultats différents selon les conditions externes, mais une cale est sous le contrôle de votre test et peut renvoyer des résultats cohérents à chaque appel. Cela rend vos tests beaucoup plus faciles à écrire. Utilisez des cales pour isoler votre code des assemblys qui ne font pas partie de votre solution. Pour isoler les composants de votre solution les uns des autres, nous vous recommandons d’utiliser des talons.

Comment déjà répondu, vous devriez découpler votre système

 public class NugetPlatformModel { public bool IsHavingLicense { get; set; } public List PlatformProduct = new List(); public NugetPlatformModel(IPlatformProductProvider provider) { var xmldoc = new XmlDocument(); //System.Web.HttpContext.Current.Server.MapPath(@"~\Content\PlatformProducts.xml") xmldoc.Load(provider.Filepath); } public interface IPlatformProductProvider { ssortingng Filepath { get; } } public class PlatformProductProvider: IPlatformProductProvider { ssortingng _filepath; public ssortingng Filepath { get { return _filepath; } set { _filepath = value;} } public PlatformProductProvider(ssortingng path) { _filepath = path; } } } 

Et votre test pourrait être:

 [Test] public void Account_UnlicensedCustomerIdentity_IsStudioLicenseAndIshavinglicenseFalse() { //Arrange // using Moq //var mock = new Mock(); //IPlatformProductProvider provider = mock.Object; //provider.Filepath = "pippo.xml"; // otherwise var provider = new PlatformProductProvider("pippo.xml"); //Act NugetPlatformModel nugetPlatformModel = new NugetPlatformModel(provider); //Assert AssertEquals(false, nugetPlatformModel.IsHavingLicense); } 

Si vous ne pouvez pas modifier le code source, essayez d’utiliser des shims ( https://msdn.microsoft.com/en-us/library/hh549176.aspx ).