Почему, когда я регистрирую свои маршруты в тесте MVC, NUnit разделяет это между тестами? - PullRequest
1 голос
/ 11 августа 2009

Я проверяю свои маршруты в приложении MVC. У меня есть следующий код:

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());
        }
    }
}

Тем не менее, 2-й тест не проходит, заявляя: System.ArgumentException: маршрут с именем «По умолчанию» уже находится в коллекции маршрутов. Имена маршрутов должны быть уникальными.

Если я запускаю тест по отдельности, он работает нормально. Очевидно, что NUnit разделяет мою таблицу маршрутизации между тестами. Почему?

Я знаю, что могу поместить свой вызов RegisterRoutes в метод TestFixtureSetup, но это не решает проблему, и я хотел бы знать, чего мне не хватает.

Я что-то пропустил? Почему я не могу найти этот вопрос где-либо еще в сети?

Спасибо! Matt

Ответы [ 2 ]

1 голос
/ 11 августа 2009

Я не думаю, что NUnit разделяет маршруты - я верю, что так работает ASP.NET MVC. Кстати, при тестировании моих маршрутов я обычно помещаю RegisterRoutes в [TestFixtureSetup]. Вы, вероятно, будете в порядке, просто сделайте то же самое.

0 голосов
/ 11 августа 2009

Я нашел эту замечательную статью от Мартина Фаулера, которая объясняет, что происходит: http://martinfowler.com/bliki/JunitNewInstance.html

Престижность книги xUnit Test Patterns, так как именно она привела меня к статье.

Я не знаю, потому что я был парнем из Java или просто делал какие-то предположения. JUnit создает новый объект TestCase для каждого метода при запуске тестов. Это означает, что даже глобальные переменные сбрасываются для каждого метода тестирования и не используются совместно.

Это не относится к NUnit. NUnit создает только один объект TestCase, поэтому любые глобальные переменные являются общими. Том, вы правы в том, что MVC создает глобальную переменную для моих маршрутов, однако NUnit не создает ее и создает новую для каждого теста, как это делают большинство других сред xUnit.

Я поместил код регистра маршрутов в метод TestFixtureSetup, и он, конечно, работает. Я рад, что понимаю, что происходит сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...