2010-07-13 3 views
13

J'utilise C# 4.0 et je dois tester un service unitaire. La fonction à l'intérieur du service retourne un chemin similaire à la variable que l'on m'attend, c'est le chemin que je m'attends à retrouver. Mais quand je lance ce test, j'obtiens l'erreur que HttpContext.Current est NULL. Que puis-je faire pour résoudre ce problème afin que le test puisse être exécuté?Utilisation de httpcontext dans le test unitaire

[TestMethod] 
public void GetPathTest() 
{ 
    var expected = System.IO.Path.GetFullPath(HttpContext.Current.Server.MapPath("~/Certificates/")); 
    var path = _mockService.Setup(o => o.GetPath()).Returns(expected); 
} 

Répondre

17

En ce moment je peux Je ne trouve pas mon wrapper complet pour HttpContext que j'ai utilisé plus tôt, mais pour le moment nous créons simplement un contexte pour une requête vide et allons de là, comme ceci:

SimpleWorkerRequest request = new SimpleWorkerRequest("","","", null, new StringWriter()); 
HttpContext context = new HttpContext(request); 

Ensuite, dans le test initialize ou dans le test unitaire unité elle-même (avant de créer prévu) vous pouvez régler le courant HttpContext comme suit:

HttpContext.Current = context; 

Puis chair simplement le contexte faux et sessionstate faux possible, etc. comme demandé.

(Edit: Tout est dans VS2008, framework 3.5 d'ailleurs).

+0

Merci pour la réponse! Cela l'a fait, mais j'ai modifié un peu le simpleworkerrequest en ajoutant le bon chemin et les bonnes adresses. – Rob

2

Vous pouvez regarder les attributs créés pour les tests unitaires ASP.Net, comme

[HostType("ASP.NET")] 

Ce link to MSDN a une très bonne écriture jusqu'à ce sujet

1

Je poste ce pour référence. Ce n'est pas une solution facile, et parle de frappe de canard (si elle caquette ..):

http://haacked.com/archive/2007/08/19/why-duck-typing-matters-to-c-developers.aspx

http://haacked.com/archive/2007/09/09/ihttpcontext-and-other-interfaces-for-your-duck-typing-benefit.aspx

Il est une lecture pertinente et la valeur; parce qu'il n'y a pas de IHttpContext, il n'est pas possible de créer une implémentation d'environnement de test - jusqu'à ce que vous envisagiez d'utiliser la bibliothèque Duck Typing ici. Bien que ce ne soit pas une réponse directe.

Espérons que ça aide.

2

Vous pouvez décorer votre méthode d'essai avec les attributs suivants:

[TestMethod] 
[HostType("ASP.NET")] 
[UrlToTest("http://localhost:xxxx/")] 
[AspNetDevelopmentServerHost("$(SolutionDir)\\xxx\\", "/")] 
public void TestMethod() 
{ 
    ... 
} 

Ensuite, l'ajout d'un fichier Default.aspx dans votre proj de test unitaire. A l'intérieur de la méthode de test, vous pouvez facilement accéder à HttpContext. Si vous voulez déboguer, vous pouvez utiliser des traces ou d'interrompre l'exécution de débogage avec le System.Diagnostics.Debugger.Break d'instruction()

public void TestMethod() 
{ 
    System.Diagnostics.Debugger.Break(); 

    ... 
} 

puis attacher débogueur au processus comme expliqué par MSDN: https://msdn.microsoft.com/en-us/library/vstudio/c6wf8e4z(v=vs.100).aspx

Questions connexes