2009-03-17 11 views

Répondre

7

Les classes et les méthodes statiques sont vraiment difficiles à utiliser dans les tests unitaires (ce qui est une des raisons pour lesquelles j'essaie de les éviter). Dans ce cas, je développerais probablement un wrapper autour de la classe statique, contenant juste les méthodes que j'utilise. J'utiliserais alors ma classe d'emballage à la place de la vraie classe. La classe wrapper serait construite de sorte qu'il est facile de se moquer.

Exemple (sorte de) utilisant RhinoMocks. Notez qu'il utilise l'injection de dépendance pour donner à la classe sous test une copie de l'encapsuleur. Si le wrapper fourni est nul, il en crée un.

public class MyClass 
{ 
    private VPU_Wrapper VPU { get; set; } 

    public MyClass() : this(null) {} 

    public MyClass(VPU_Wrapper vpu) 
    { 
     this.VPU = vpu ?? new VPU_Wrapper(); 
    } 

    public string SomeMethod(string path) 
    { 
     return this.VPU.ToAbsolute(path); 
    } 
} 

public class VPU_Wrapper 
{ 
    public virtual string ToAbsolute(string path) 
    { 
     return VirtualPathUtility.ToAbsolute(path); 
    } 
} 

[TestMethod] 
public void SomeTest() 
{ 
    string path = "~/path"; 
    string expected = "/app/path"; 

    var vpu = MockRepository.GenerateMock<VPU_Wrapper>(); 
    vpu.Expect(v => v.ToAbsolute(path)).Return(expected); 

    MyClass class = new MyClass(vpu); 

    string actual = class.SomeMethod(path); 

    Assert.AreEqual(expected, actual); 

    vpu.VerifyAllExpectations(); 
} 
+1

+1 pour l'emballage, que dit que je préfère déclarer explicitement une interface pour des choses que je me moquerai comme ça – eglasius

+0

@Freddy - J'utilise souvent une interface aussi bien. – tvanfosson

15

Nous sommes bien au-delà VS 2008, mais pour tous ceux qui encore avec ce aux prises question, j'ai trouvé une solution sur: http://forums.asp.net/t/995143.aspx?Mocking+HTTPContext+object.

Utilisez le code suivant dans votre init de test pour remplacer les valeurs AppDomain par défaut. (Les méthodes statiques VirutalPathUtility utiliseront vos nouvelles valeurs.)

[TestInitialize] 
public void Initialize() 
{ 
    // Fake out env for VirtualPathUtility.ToAbsolute(..) 
    string path = AppDomain.CurrentDomain.BaseDirectory; 
    const string virtualDir = "/"; 
    AppDomain.CurrentDomain.SetData(".appDomain", "*"); 
    AppDomain.CurrentDomain.SetData(".appPath", path); 
    AppDomain.CurrentDomain.SetData(".appVPath", virtualDir); 
    AppDomain.CurrentDomain.SetData(".hostingVirtualPath", virtualDir); 
    AppDomain.CurrentDomain.SetData(".hostingInstallDir", HttpRuntime.AspInstallDirectory); 
    TextWriter tw = new StringWriter(); 
    HttpWorkerRequest wr = new SimpleWorkerRequest("default.aspx", "", tw); 
    HttpContext.Current = new HttpContext(wr); 
} 
+4

J'avais noté cela au début. Chaque fois que je faisais une recherche sur le sujet, ce message revenait toujours et je pensais que ce serait pertinent pour les outils actuels. –

+0

Nous sommes autorisés à partager des connaissances dans un style Q & A ici. En particulier, vous pouvez poser une question distincte pour les outils 2013 et fournir la réponse ci-dessus. Je ne recommande normalement pas cela pour les nouveaux utilisateurs de [donc]. Je ne suis pas certain que vous pouvez le faire avec un "1" représentant. Mais il pourrait autrement être approprié de le faire. –

+2

+1: La façon dont la question est intitulée, Google va toujours retourner cela comme un succès. C'est donc une bonne idée d'improviser les réponses. Je suis désolé mais je ne pense pas pouvoir être d'accord avec le raisonnement downvote. Ce n'est pas la réponse acceptée et cela suffit. – Mrchief

3

En utilisant Microsoft Fakes nous pouvons faux VirtualPathUtility ToAbsolute Méthode facilement.

  1. Parcourir System.Web dans Références> Clic droit> Ajouter un assemblage Faux.

Utilisez le code Après

using Microsoft.QualityTools.Testing.Fakes; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using System.Web.Fakes; 

public class TestCode 
    { 
     [TestMethod] 
     public void TestSummaryTabLinks() 
     { 
      using (ShimsContext.Create()) 
      { 
       //Fake VirtualPathUtility ToAbsolute method to Work properly in case of Unit Test Project 
       //For Finding Relative url. 
       ShimVirtualPathUtility.ToAbsoluteString = (string s) => { return s; }; 

       MyClass class = new MyClass(vpu); 

       string actual = class.SomeMethod(path); 

       Assert.AreEqual(expected, actual); 

      } 
     } 

} 
+1

Ce n'est pas une réponse à la question - la question est explicitement sur VS2008, qui n'a pas eu de contrefaçon. –

Questions connexes