J'essaie de tester un code qui appelle VirtualPathUtility.ToAbsolute
. Est-ce possible avec les outils de tests unitaires fournis avec VS 2008? Sinon, est-ce possible avec une version ultérieure de Visual Studio?Test de code unitaire qui appelle VirtualPathUtility.ToAbsolute
Répondre
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();
}
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);
}
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. –
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. –
+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
En utilisant Microsoft Fakes nous pouvons faux VirtualPathUtility ToAbsolute Méthode facilement.
- 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);
}
}
}
Ce n'est pas une réponse à la question - la question est explicitement sur VS2008, qui n'a pas eu de contrefaçon. –
- 1. Code de test unitaire qui envoie des messages JMS
- 2. constructeur de test unitaire qui utilise My.Settings
- 3. Servlets de test unitaire
- 4. Un code de test unitaire qui fait essentiellement de la persistance - Dois-je m'en préoccuper?
- 5. Test unitaire: Maven ou Eclipse?
- 6. Fonctions de test unitaire reposant sur MouseEventArgs?
- 7. Test unitaire avec un fichier d'entrée
- 8. GWT Test unitaire TDD et outillage
- 9. Control.ResolveUrl versus Control.ResolveClientUrl versus VirtualPathUtility.ToAbsolute
- 10. Échec du test unitaire en raison d'une erreur de 0,000000001f
- 11. Outil de test unitaire pour la base de données Sybase
- 12. Redéfinition des haricots de printemps dans l'environnement de test unitaire
- 13. Est-ce que quelqu'un sait d'un outil qui générera automatiquement des souches de test unitaire?
- 14. test unitaire sur le fichier de téléchargement xls
- 15. Si vous changez de code avec un test unitaire, lequel changez-vous en premier?
- 16. Obtention d'arguments de ligne de commande dans un test unitaire
- 17. Quel cadre de test unitaire gratuit pour C#?
- 18. Mocking l'instanciation d'un objet pour un test unitaire
- 19. Est-ce trop compliqué d'exécuter le test unitaire avec Valgrind?
- 20. Création d'un processus séparé à partir d'un test unitaire
- 21. Meilleur cadre de test unitaire pour l'ancienne école QNX?
- 22. Cadre d'isolation de test unitaire préféré pour .net
- 23. Refactorisation d'une méthode qui appelle d'autres méthodes qui lancent Exception
- 24. Création d'un objet System.Web.Caching.Cache dans un test unitaire
- 25. Test des procédures stockées CLR SQL avec le projet de test unitaire
- 26. Pourquoi voyons-nous une exception ModuleLoadExceptionHandlerException lors du test unitaire
- 27. Comment effectuer un test unitaire pour une application Web?
- 28. Spring - Ignorer la méthode init en test unitaire
- 29. Comment puis-je écrire un test unitaire pour l'événement Gridview_RowCommand?
- 30. Comment passer l'objet FormCollection pour testmethod pendant le test unitaire
+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
@Freddy - J'utilise souvent une interface aussi bien. – tvanfosson