2010-05-18 5 views
0

Après quelques recherches ici, je pris les conseils de ce fil: How to unit test C# Web Service with Visual Studio 2008classe de tests unitaires dans un service Web en .net

J'ai créé une classe distincte et ma classe de service Web est juste une enveloppe pour que l'on . Le problème est que lorsque j'essaie de créer un projet de test unitaire dans VS2008, il insiste pour créer un test unitaire qui agit comme si je testais les appels de service Web au lieu de la classe que j'avais spécifiée. Je ne peux pas arriver à la classe que j'essaie de tester.

J'ai un service Web "subscription_api.asmx". Le code derrière est "subscription_api.cs" qui contient les appels de l'encapsuleur de la méthode web au code réel à "subscription.cs".

Je pense pouvoir faire ce qui suit:

[TestMethod()] 
     public void GetSystemStatusTest() 
     { 
      subscription sub = new subscription(); 
      XmlNode node = sub.GetSystemStatusTest(); 
      Assert.IsNotNull(node); 
     } 

Mais au lieu-je obtenir ce gâchis qui est généré automatiquement à partir VS'08:

/// <summary> 
     ///A test for GetSystemStatus 
     ///</summary> 
     // TODO: Ensure that the UrlToTest attribute specifies a URL to an ASP.NET page (for example, 
     // http://.../Default.aspx). This is necessary for the unit test to be executed on the web server, 
     // whether you are testing a page, web service, or a WCF service. 
     [TestMethod()] 
     [HostType("ASP.NET")] 
     [AspNetDevelopmentServerHost("C:\\CVSROOT\\rnr\\pro\\product\\wms\\ss\\subscription_api", "/subscription_api")] 
     [UrlToTest("http://localhost/subscription_api")] 
     public void GetSystemStatusTest() 
     { 
      subscription_Accessor target = new subscription_Accessor(); // TODO: Initialize to an appropriate value 
      XmlNode expected = null; // TODO: Initialize to an appropriate value 
      XmlNode actual; 
      actual = target.GetSystemStatus(); 
      Assert.AreEqual(expected, actual); 
      Assert.Inconclusive("Verify the correctness of this test method."); 
     } 

De plus, il y a une « subscription_api .accessor "dans le dossier Références de test.

Quand j'essayez ceci:

[TestMethod()] 
public void GetSystemStatusTest2() 
{ 
    subscription_Accessor sub = new subscription_Accessor(); 
    XmlNode node = sub.GetSystemStatus(); 
    Assert.IsNotNull(node); 
} 

Je reçois une erreur:

Test method subscription_api.Test.subscriptionTest.GetSystemStatusTest2 threw exception: System.TypeInitializationException: The type initializer for 'subscription_Accessor' threw an exception. ---> System.ArgumentNullException: Value cannot be null. 

Je suis vraiment nouveau pour les tests unitaires et je me sens perdu. Comment puis-je créer un test unitaire juste pour ma classe d'abonnement dans "subscription.cs" sans tester le service web? Suis-je limité à tester dans le même projet (j'espère que non)? Dois-je mettre la classe cible dans son propre projet en dehors du projet de service Web?

Répondre

2

Il semble que votre service Web ait été créé dans un projet "site Web" au lieu d'un projet "application Web". Le problème est que les sites Web ne sont pas construits à une seule DLL que vous pouvez référencer, comme le sont les projets web.

Si tel est le cas et que vous utilisez un projet de type site Web, vous devez le convertir en projet d'application Web pour bénéficier directement du test unitaire du code. Il ya beaucoup de billets de blog sur la façon de convertir votre projet, il suffit de chercher "convertir le site web asp.net en application web".

Vous pouvez également déplacer ce code dans sa propre bibliothèque de classes et référencer cette bibliothèque dans le projet qui contient votre service Web.

+0

OK, merci pour l'info. Une chose que j'ai oublié de mentionner, c'est que ce projet a été converti de VS'05 à VS'08 dans le but exprès de le rendre testable. –

+0

Cela a fait l'affaire.VS'08 veut toujours créer des tests de service Web quand j'essaie d'autogénérer les tests unitaires, mais je peux créer les tests que je veux à la main et ils se comportent comme prévu. –

+0

Génial. Personnellement, je souhaite qu'ils enlèvent tous les projets de type site Web de VS tous ensemble. ;) Content de pouvoir aider. –

-1

Pour tester un service WCF dans un projet de site Web, vous pouvez également ajouter le service à votre projet de test avec "Ajouter une référence de service". En tant qu'URL, entrez l'URL http://localhost:4324/...?wsdl.

Maintenant, vous pouvez écrire une méthode d'essai:

[TestClass()] 
public class MyServiceTest 
{ 
    #region -- Webservice initialisation 

    // The client object for the WCF service. 
    private static MyServiceNamespace.MyServiceClient _service; 

    [ClassInitialize] 
    public static void InitializeClass(TestContext ctx) 
    { 
     _service = new MyServiceNamespace.MyServiceClient(); 
    } 

    [ClassCleanup] 
    public static void CleanupClass() 
    { 
     _service.Close(); 
    } 

    #endregion 


    // An example test 
    [TestMethod()] 
    public void GetBlaBlaTest() 
    { 
     var actual = _service.GetBlaBla(); 
     Assert.IsTrue(actual.Status.IsSuccess, "Call should return success status"); 
     Assert.AreEqual("blabla", actual.Result, "Call should return the string 'blabla'"); 
    } 
} 

Lorsque le projet est lancé, à la fois l'application de test unitaire et projet de site Web commencera, et les tests en cours d'exécution sur le serveur de développement ASP.NET. Ceci a l'avantage que tout code d'initialisation fonctionnera correctement, simulant l'utilisation réelle du service.

+0

La question ne concerne pas un service Web WCF. – jcmcbeth