2009-08-11 6 views
1

Je suis en train de tester mes routes dans une application mvc. J'ai le code suivant:Pourquoi, lorsque j'inscris mes routes dans un test MVC, NUnit partage-t-il les tests?

using System.Web.Routing; 
using MvcContrib.TestHelper; 
using NUnit.Framework; 
using web; 
using web.Controllers; 

namespace tests.web.Routes 
{ 
    [TestFixture] 
    public class routeTests 
    { 
     [Test] 
     public void Route_POSURL_MapsToPOSIndex() 
     { 
      MvcApplication.RegisterRoutes(RouteTable.Routes); 
      "~/POS".ShouldMapTo<POSController>(x => x.Index()); 
     } 

     [Test] 
     public void Route_POSGetItem_MapsToPOSGetItem() 
     { 
      MvcApplication.RegisterRoutes(RouteTable.Routes); 
      "~/POS/GetItem/12345".ShouldMapTo<POSController>(x => x.GetItem()); 
     } 
    } 
} 

Cependant, le 2ème test échoue indiquant: System.ArgumentException: Une route nommée 'Default' est déjà dans la collection d'itinéraire. Les noms de route doivent être uniques.

Si j'effectue l'un ou l'autre des tests individuellement, ils fonctionnent correctement. Évidemment, NUnit partage ma table de routage entre les tests. Pourquoi?

Je sais que je peux mettre mon appel RegisterRoutes dans une méthode TestFixtureSetup mais cela ne répond pas au problème et j'aimerais savoir ce qui me manque.

Est-ce que je manque quelque chose? Comment se fait-il que je ne trouve pas cette question ailleurs sur le net?

Merci! Matt

Répondre

1

Je ne pense pas que NUnit partage les routes - je crois que c'est ainsi que fonctionne ASP.NET MVC. FWIW, lors du test de mes routes, je place habituellement RegisterRoutes dans [TestFixtureSetup]. Vous seriez probablement d'accord pour faire la même chose.

0

Je trouve cet article de Martin Fowler qui explique ce qui se passe: http://martinfowler.com/bliki/JunitNewInstance.html

Kudos au livre de modèles de test xUnit, car il est celui qui m'a conduit à l'article.

Je ne sais pas si c'est parce que j'étais java ou si je faisais juste quelques suppositions. JUnit crée un nouvel objet TestCase pour chaque méthode lorsque vous exécutez des tests. Cela signifie que même les variables globales sont réinitialisées pour chaque méthode de test et ne sont pas partagées.

Ce n'est pas le cas avec NUnit. NUnit crée un seul objet TestCase, ainsi toutes les variables globales sont partagées. Tom, vous avez raison dans le fait que MVC crée la variable globale pour mes routes, cependant, NUnit ne la sauvegarde pas et en crée une nouvelle pour chaque test comme la plupart des autres frameworks xUnit.

J'ai placé le code des routes de registre dans la méthode TestFixtureSetup, et cela fonctionne bien sûr. Je suis content de comprendre ce qui se passe maintenant.

Questions connexes