Модульное тестирование Controller.Initialize - PullRequest
3 голосов
/ 15 января 2009

Я устанавливаю культуру потоков в культуру, отправляемую через cookie в HttpRequest, в методе инициализации базового контроллера, который я создал. Теперь я хочу создать модульный тест для этой функции.

В тесте я создал макет HttpContext и добавил Cookie. Используя это и помощник routeData, я создаю RequestContext. Затем я создаю новый контроллер и вызываю Execute на нем, передавая RequestContext.

Сначала я столкнулся с проблемой, связанной с TempData и SessionState, которую я исправил, установив TempData и создав на сервере контроллер EmptyTempDataProvider.

Тогда у меня была проблема с VirtualPathProviderViewengine, которую я исправил, создав VoidActionInvoker.

Это лучший способ проверить метод инициализации? Кто-нибудь делает что-то подобное и хочет поделиться каким-нибудь кодом?

Спасибо, Jon

namespace MyApp.UnitTests {
[TestClass]
public class ControllerTests {
    [TestInitialize]
    public void Setup() {
        RouteTable.Routes.Clear();
        MyApp.MvcApplication.RegisterRoutes(RouteTable.Routes);
    }

    [TestMethod]
    public void Thread_culture_should_be_set_to_cookie_culture() {
        // Arrange
        var context = HttpMockHelper.FakeHttpContext();
        context.Request.Cookies.Add(new HttpCookie(CultureService.CookieName, "nl-NL"));
        var reqContext = new RequestContext(context, "~/Home/Landing".Route());
        var controller = new HomeController {
            TempData = new TempDataDictionary(),
            TempDataProvider = new EmptyTempDataProvider(),
            ActionInvoker = new VoidActionInvoker()
        };

        // Act
        (controller as IController).Execute(reqContext);

        // Assert
        Assert.AreEqual("nl-NL", Thread.CurrentThread.CurrentCulture.Name);
    }
}

internal class VoidActionInvoker : ControllerActionInvoker {
    protected override ActionExecutedContext InvokeActionMethodWithFilters(System.Reflection.MethodInfo methodInfo, IDictionary<string, object> parameters, IList<IActionFilter> filters) {
        return new ActionExecutedContext(this.ControllerContext, false, null);
    }

    protected override void InvokeActionResult(ActionResult actionResult) {
    }
}

internal class EmptyTempDataProvider : ITempDataProvider {
    public void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values) {
    }

    public IDictionary<string, object> LoadTempData(ControllerContext controllerContext) {
        return new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
    }
}
}

1 Ответ

1 голос
/ 16 января 2009

Звучит правильно, метод initialize принимает параметр для requestcontext, для которого требуется HttpContext, если я правильно понял ваш пост, вы дразните эти объекты и добавляете значения, которые хотите проверить, а затем гарантируете Метод работает правильно. Звучит так же, как я бы сделал. Хотя я не возражаю против просмотра некоторого кода.

Редактировать: Ваши тесты выглядят хорошо для меня.

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