2009-04-25 3 views
7

J'ai essayé d'apprendre ASP.NET MVC en utilisant les vidéos postées sur le ASP.NET website et je rencontre un problème de test unitaire.tests unitaires ASP.NET MVC avec NUnit

J'ai un contrôleur très simple qui utilise LINQ to SQL pour obtenir un tableau d'objets:

public ActionResult Index() 
    { 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 
     using (TrainingLogDataContext dc = new TrainingLogDataContext()) 
     { 
      ViewData.Model = dc.Workouts.ToArray(); 
     } 

     return View(); 
    } 

Cela échoue en NUnit avec l'erreur suivante:

at TrainingLog.Models.TrainingLogDataContext..ctor() in C:\Webs\TrainingLog\TrainingLog\Models\TrainingLog.designer.cs:line 41 
at TrainingLog.Controllers.HomeController.Index() in C:\Webs\TrainingLog\TrainingLog\Controllers\HomeController.cs:line 16 
at TrainingLogTests.Controllers.HomeControllerTest.Index() in C:\Webs\TrainingLog\TrainingLog.Tests\Controllers\HomeControllerTest.cs:line 23 

Je suppose que le problème est que NUnit ne peut pas obtenir la chaîne de connexion pour le DataContext de web.config. Quel est le meilleur moyen de contourner cela?

Cela fonctionne très bien lorsque j'exécute la page, mais le test de l'unité échoue dans NUnit.

Répondre

3

L'amure que j'ai prise était de simuler le contexte de données. J'utilise une usine pour créer le contexte de données et l'injecter dans le contrôleur. Si la fabrique est null (ce qui se produit lorsque le constructeur sans paramètre est appelé), elle crée une instance par défaut de l'usine qui se connecte à la base de données. Dans mes tests unitaires, j'utilise une usine qui crée un faux contexte de données qui fonctionne en mémoire. J'ai basé mon contexte de données factice sur le code this blog, bien que je l'ai étendu pour gérer les objets ajoutés à la base de données via des ensembles d'entités.

Si vous ne voulez pas aller sur la route fictive (et je le recommande, même si cela prendra un peu de travail à l'avant). Vous pouvez ajouter un fichier app.config à votre projet de test unitaire et y placer les chaînes de connexion pour votre contexte de données.

0

Le plus simple est d'avoir NUnit installé avant d'installer ASP.NET MVC puis mis en place le projet de test lorsque vous créez le ASP.NET MVC projet. Vous pouvez ensuite créer les éléments de configuration nécessaires pour faire ce que vous essayez. REMARQUE: La meilleure façon de travailler avec les données est de les railler, ce qui signifie que vous devez déplacer votre LINQ hors de votre contrôleur, car vous ne pouvez pas facilement inverser le contrôle sur un contrôleur.

5

Copiez vos chaînes de connexion dans le web.config projet app.config dans votre projet de test de nunit.

+1

fonctionne pour moi, merci :) – melaos

1

Il est préférable de ne pas accéder à une base de données à partir de vos tests unitaires car cela entraînera des tests qui s'exécutent si lentement que vous arrêterez de prendre la peine d'exécuter les tests. Mais si vous voulez faire cela, vous pouvez créer un fichier app.config dans votre projet NUnit et y placer votre chaîne de connexion. Parfois, NUnit ne reconnaît pas ce fichier app.config, mais vous pouvez trouver plus de détails sur la manière de le configurer dans les réponses à "How to initialize ConnectionStrings collection in NUnit".