Question

Tout d'abord, je suis conscient du fait que cette question est dangereusement proche de: Comment mapPath dans un test unitaire en C #

J'espère cependant qu'il a une autre solution. Ma question suivante:

Dans mon code, j'ai un objet qui doit être validé. Je crée des tests unitaires pour chaque méthode de validation pour vous assurer qu'il est correctement valider. Je crée des données simulées et le charger dans l'objet, puis valider. Le problème est que l'intérieur de la validation, en cas d'erreur, un code d'erreur est attribué. Ce code d'erreur est utilisé pour recueillir des informations sur l'erreur à partir d'un fichier XML à l'aide Server.MapPath. Cependant, en essayant d'obtenir le fichier xml, une exception est levée signifie que le fichier ne peut être trouvé.

Depuis MapPath est dans mon code de validation, et non mon test unitaire, comment puis-je obtenir mon test unitaire pour reconnaître le chemin? Est-ce que cette question a du sens?

Ligne d'erreur (Dans mon code de validation PAS mon test unitaire):

XDocument xdoc = XDocument.Load(HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml"));

simplifié: Le test unitaire appelle une méthode dans mon programme qui appelle Server.MapPath qui échoue

.
Était-ce utile?

La solution

Je résumé le « fournisseur de nom de fichier » dans une classe qui retourne un emplacement tout simplement, vous pouvez alors se moquer de beaucoup, beaucoup plus facile.

public class PathProvider
{
    public virtual string GetPath()
    {
        return HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml");
    }
}

Ensuite, vous pouvez utiliser la classe PathProvider directement ...

PathProvider pathProvider = new PathProvider();
XDocument xdoc = XDocument.Load(pathProvider.GetPath());

Ou moquer dans vos tests:

PathProvider pathProvider = new MockPathProvider(); // using a mocking framework
XDocument xdoc = XDocument.Load(pathProvider.GetPath());

Autres conseils

Après quelques googler rigoureux et l'aide d'un collègue nous sommes arrivés avec une solution simple déjà intégrée dans .net

Au-dessus des tests unitaires qui accède au processus de validation, j'ai ajouté:

 [TestMethod()]
 [HostType("ASP.NET")]
 [UrlToTest("http://localhost:###/upload_file.aspx")]
 [AspNetDevelopmentServerHost("Path To Web Application", "Path To Web Root")]

Cela fonctionne parfaitement. En fait, lorsque le test est appelé, il charge l'URL avec le test unitaire spécifié dans la charge de page. Comme il est un site Web qui appelle maintenant le test unitaire, la validation aura accès à Server.MapPath. Cette solution peut ne pas fonctionner pour tout le monde, mais il était parfait pour cela. Merci à tous ceux que vous avez contribué.

Essayez d'utiliser Rhino Mocks ou un cadre moqueur alternative à Mock HttpContext (ou d'autres objets dépendants) Ou vous pouvez écrire vos propres objets fantaisie. Ou écrire une classe MapPathWrapper, hériter d'une classe de MapPathWrapperBase pour votre environnement réel, puis en pour vos tests unitaires créer un objet MockMapPathWrapper.

Il devrait y avoir beaucoup d'exemples pour se moquant sur le SO.

Voici que j'ai posée:

Comment utiliser Rhino Mocks pour se moquer d'un HttpContext .Application

UPDATE Je n'ai que l'expérience de faire cela avec l'Asp.Net MVC, avec webforms j'ImageIN ce serait beaucoup plus difficile en raison de l'absence d'une classe HttpContextBase.

J'extraire des méthodes qui acceptent vos dépendances comme arguments:

public void Validate(HttpContext context)
{
    ValidatePath(context.Server.MapPath("App_Data/ErrorCodes.xml"));
}

public void ValidatePath(string path)
{
    XDocument xdoc = XDocument.Load(path);
    ValidateDocument(xdoc);
}

public void ValidateDocument(XDocument xdoc)
{
    // Original code
}

Vous pouvez ensuite tester les différentes méthodes de façon indépendante. Par exemple, comment tester gère ValidatePath() un fichier manquant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top