2010-05-25 8 views
2

J'essaie de créer un ensemble de tests unitaires MS Visual Studio pour mon application Web à plusieurs niveaux, mais pour une raison quelconque, je ne peux pas les exécuter des tests et je reçois l'erreur suivante -Problème avec les tests unitaires du projet ASP.NET (NullReferenceException lors de l'exécution du test)

« référence d'objet non définie à une instance d'un objet »

Ce que je suis en train de faire est le test de ma couche d'accès aux données où j'utilise Classe de contexte de données LINQ pour exécuter une certaine fonction et renvoyer un résultat, cependant pendant le processus de débogage, j'ai découvert que tous les tests échouent dès que comme ils obtiennent à la classe de contexte de données LINQ et il a quelque chose à voir avec la chaîne de connexion, mais je ne peux pas comprendre quel est le problème.

La mise au point de tests échoue ici (la deuxième ligne):

public EICDataClassesDataContext() : 
    base(global::System.Configuration.ConfigurationManager.ConnectionStrings["EICDatabaseConnectionString"].ConnectionString, mappingSource) 
    { 
     OnCreated(); 
    } 

Et mon test est la suivante:

TestMethod()] 
    public void OnGetCustomerIDTest() 
    { 
     FrontLineStaffDataAccess target = new FrontLineStaffDataAccess(); // TODO: Initialize to an appropriate value 
     string regNo = "jonh"; // TODO: Initialize to an appropriate value 
     int expected = 10; // TODO: Initialize to an appropriate value 
     int actual; 
     actual = target.OnGetCustomerID(regNo); 
     Assert.AreEqual(expected, actual); 
    } 

La méthode que j'appelle de DAL est:

public int OnGetCustomerID(string regNo) 
    { 
     using (LINQDataAccess.EICDataClassesDataContext dataContext = new LINQDataAccess.EICDataClassesDataContext()) 
     { 
      IEnumerable<LINQDataAccess.GetCustomerIDResult> sProcCustomerIDResult = dataContext.GetCustomerID(regNo); 
      int customerID = sProcCustomerIDResult.First().CustomerID; 

      return customerID; 
     } 
    } 

Donc, fondamentalement, tout échoue après avoir atteint la première ligne de la méthode de couche DA et quand elle essaie d'instancier t La classe d'accès aux données LINQ ...

J'ai passé environ 10 heures à essayer de résoudre le problème mais aucun résultat ... J'apprécierais vraiment toute aide!

MISE À JOUR: Enfin, je l'ai résolu ce !!!! :) Je ne sais pas pourquoi, mais pour certaines raisons dans le fichier app.config la connexion à ma base de données a été comme suit:

AttachDbFilename = | DataDirectory | \ EICDatabase.MDF

Donc ce que j'ai fait, c'est que je viens de changer le chemin et au lieu de | DataDirectory | Je mets le chemin réel où mon fichier MDF est assis, à savoir

C: \ Users \ 1 \ Documents \ Visual Studio 2008 \ Projects \ EICWebSystem \ EICWebSystem \ App_Data \ EICDatabase.mdf

Après Mais je ne sais toujours pas quel était le problème ... probablement un chemin incorrect vers la base de données Mon web.config de projet ASP.NET contient le chemin | DataDirectory | \ EICDatabase.MDF cependant ..

+0

Hey Alex, un coup d'oeil à ce http://stackoverflow.com/questions/236412/connexion-chaîne-enfer-dans-net-linq-sql-asp-net J'espère que cela vous aide. – Malcolm

+0

J'ai essayé de créer le fichier app_config sous le répertoire du projet Test, puis j'ai simplement copié-collé la section 'Connectionstrings' du fichier web.config dans ce fichier app.config et après avoir exécuté le test, j'ai obtenu une exception différente : "System.Data.SqlClient.SqlException: Échec de la tentative de connexion d'une base de données nommée automatiquement pour le fichier C: \ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE \ EICDatabase.mdf Une base de données portant le même nom existe, ou fichier spécifié ne peut pas être ouvert, ou il est situé sur le partage UNC .. "Ai-je fait mal ou c'est un autre nouveau problème? – Alex

Répondre

0

Pour moi, il semble que votre problème est la chaîne de connexion, qui n'est pas définie. Je suppose que votre test d'unité est dans un projet différent de celui du DAL. Vous appelez la commande 'new' sur le constructeur datacontext sans une chaîne de connexion. Donc, il devrait normalement utiliser sa valeur par défaut, lorsqu'il est défini. Mais comme ce paramètre est normalement stocké dans le fichier web.config de l'autre projet, aucune chaîne de connexion n'est définie et vous obtenez l'erreur. Si c'est vrai, je suppose que vous devez obtenir les paramètres du projet DAL dans le projet de tests unitaires. La solution la plus simple consiste à copier la chaîne de connexion web.config dans app.config du projet de test unitaire.

Il existe d'autres possibilités, mais je ne pense pas qu'il soit facile d'obtenir la configuration web.config dans votre projet de test d'unité.

2

Est-ce que LINQDataAccess.EICDataClassesDataContext recherche le web.config ou une autre source externe de données pour sa configuration?

Je peux vous dire que vous devez sauter par des cerceaux pour obtenir web.config accessible à votre code de test.

Mise à jour Ah, oui. Je vois que vous utilisez ConfigurationManager sur la ligne où votre test échoue ... ConfigurationManager se tourne vers web.config pour la configuration. Cela a été un point dur pour moi quand j'écris mes tests.

Vous devez soit modifier le code pour que la classe puisse être instanciée sans web.config, soit vous devez faire en sorte que vos tests puissent accéder à web.config.

+0

Consultez cette discussion pour une solution possible au problème: http://stackoverflow.com/questions/2503105/vsts-load-test-datasource-issues/2503406#2503406 –

+0

Merci pour votre explication, maintenant je comprends enfin ce qui est le problème, mais pouvez-vous me dire quel est le moyen de rendre mes tests pouvant accéder à web.config? Je veux dire que je dois juste établir une connexion dont j'ai besoin pour exécuter les tests, mais je n'ai aucune idée comment le faire .. – Alex

+0

@Alex, essayez de suivre les instructions données dans la discussion que j'ai référencée dans le commentaire précédent. –

2

Votre projet de test possède-t-il son propre fichier de configuration? Ce type de comportement signifie généralement que l'application ne trouve pas la chaîne de connexion. Les projets de test nécessitent leur propre fichier car ils ne sont pas exécutés dans le contexte de l'application cliente.

MISE À JOUR L'erreur que vous décrivez après l'ajout d'un app.config est courant lors du test des applications Web construites sur SQLExpress et la fixation d'un mdf. SQLExpress ne peut pas être exécuté dans plusieurs processus à la fois. Ainsi, si vous avez précédemment exécuté votre application Web, elle peut toujours être active et entrera en conflit avec la tentative de connexion de la base de données.

Vous pouvez utiliser SQL Management Studio pour fixer la base de données en permanence et utiliser une chaîne de connexion plus traditionnelle comme:

Server=myServer;Database=EICDatabase;Trusted_Connection=True; 
Questions connexes