Mocking Asp.net-mvc Контекст

Таким образом, контекст controllerа зависит от некоторых внутренних элементов asp.net. Каковы некоторые способы чистому изложению их для модульных тестов? Похоже, что очень легко забить тесты с тоннами настройки, когда мне нужно только, например, Request.HttpMethod, чтобы вернуть «GET».

Я видел несколько примеров / помощников в сетях, но некоторые из них датированы. Полагали, что это будет хорошее место, чтобы сохранить последнее и самое большое.

Я использую последнюю версию носорогов

7 Solutions collect form web for “Mocking Asp.net-mvc Контекст”

Использование MoQ выглядит примерно так:

var request = new Mock(); request.Expect(r => r.HttpMethod).Returns("GET"); var mockHttpContext = new Mock(); mockHttpContext.Expect(c => c.Request).Returns(request.Object); var controllerContext = new ControllerContext(mockHttpContext.Object , new RouteData(), new Mock().Object); 

Я думаю, синтаксис Rhino Mocks похож.

Ниже приведен пример тестового classа с использованием MsTest и Moq, который издевается над объектами HttpRequest и HttpResponse. (.NET 4.0, ASP.NET MVC 3.0)

Действие controllerа получает значение из запроса и устанавливает HTTP-заголовок в объектах ответа. Другие объекты контекста http могут быть смешаны подобным образом

 [TestClass] public class MyControllerTest { protected Mock HttpContextBaseMock; protected Mock HttpRequestMock; protected Mock HttpResponseMock; [TestInitialize] public void TestInitialize() { HttpContextBaseMock = new Mock(); HttpRequestMock = new Mock(); HttpResponseMock = new Mock(); HttpContextBaseMock.SetupGet(x => x.Request).Returns(HttpRequestMock.Object); HttpContextBaseMock.SetupGet(x => x.Response).Returns(HttpResponseMock.Object); } protected MyController SetupController() { var routes = new RouteCollection(); var controller = new MyController(); controller.ControllerContext = new ControllerContext(HttpContextBaseMock.Object, new RouteData(), controller); controller.Url = new UrlHelper(new RequestContext(HttpContextBaseMock.Object, new RouteData()), routes); return controller; } [TestMethod] public void IndexTest() { HttpRequestMock.Setup(x => x["x"]).Returns("1"); HttpResponseMock.Setup(x => x.AddHeader("name", "value")); var controller = SetupController(); var result = controller.Index(); Assert.AreEqual("1", result.Content); HttpRequestMock.VerifyAll(); HttpResponseMock.VerifyAll(); } } public class MyController : Controller { public ContentResult Index() { var x = Request["x"]; Response.AddHeader("name", "value"); return Content(x); } } 

Вот fragment из ссылки Джейсона. Его так же, как метод Фила, но использует носорог.

Примечание: mockHttpContext.Request заштрихован для возврата mockRequest до того, как внутренняя часть mockRequest будет удалена. Я считаю, что этот порядок требуется.

 // create a fake web context var mockHttpContext = MockRepository.GenerateMock(); var mockRequest = MockRepository.GenerateMock(); mockHttpContext.Stub(x => x.Request).Return(mockRequest); // tell the mock to return "GET" when HttpMethod is called mockRequest.Stub(x => x.HttpMethod).Return("GET"); var controller = new AccountController(); // assign the fake context var context = new ControllerContext(mockHttpContext, new RouteData(), controller); controller.ControllerContext = context; // act ... 

Процедура для этого, похоже, немного изменилась в MVC2 (я использую RC1). Решение Phil Haack для меня не работает, если для действия требуется конкретный метод ( [HttpPost] , [HttpGet] ). Повернувшись вокруг Reflector, похоже, что метод проверки этих атрибутов изменился. MVC теперь проверяет request.Headers , request.Form и request.QueryString для значения X-HTTP-Method-Override .

Если вы добавляете mocks для этих свойств, он работает:

 var request = new Mock(); request.Setup(r => r.HttpMethod).Returns("POST"); request.Setup(r => r.Headers).Returns(new NameValueCollection()); request.Setup(r => r.Form).Returns(new NameValueCollection()); request.Setup(r => r.QueryString).Returns(new NameValueCollection()); var mockHttpContext = new Mock(); mockHttpContext.Expect(c => c.Request).Returns(request.Object); var controllerContext = new ControllerContext(mockHttpContext.Object, new RouteData(), new Mock().Object); 

Или вы можете сделать это с помощью Typemock Isolator без необходимости отправлять фальшивый controller вообще:

 Isolate.WhenCalled(()=>HttpContext.Request.HttpMethod).WillReturn("Get"); 

я закончил с этой спецификацией

 public abstract class Specification  where C: Controller { protected C controller; HttpContextBase mockHttpContext; HttpRequestBase mockRequest; protected Exception ExceptionThrown { get; private set; } [SetUp] public void Setup() { mockHttpContext = MockRepository.GenerateMock(); mockRequest = MockRepository.GenerateMock(); mockHttpContext.Stub(x => x.Request).Return(mockRequest); mockRequest.Stub(x => x.HttpMethod).Return("GET"); EstablishContext(); SetHttpContext(); try { When(); } catch (Exception exc) { ExceptionThrown = exc; } } protected void SetHttpContext() { var context = new ControllerContext(mockHttpContext, new RouteData(), controller); controller.ControllerContext = context; } protected T Mock() where T: class { return MockRepository.GenerateMock(); } protected abstract void EstablishContext(); protected abstract void When(); [TearDown] public virtual void TearDown() { } } 

и сок здесь

 [TestFixture] public class When_invoking_ManageUsersControllers_Update :Specification  { private IUserRepository userRepository; FormCollection form; ActionResult result; User retUser; protected override void EstablishContext() { userRepository = Mock(); controller = new ManageUsersController(userRepository); retUser = new User(); userRepository.Expect(x => x.GetById(5)).Return(retUser); userRepository.Expect(x => x.Update(retUser)); form = new FormCollection(); form["IdUser"] = 5.ToString(); form["Name"] = 5.ToString(); form["Surename"] = 5.ToString(); form["Login"] = 5.ToString(); form["Password"] = 5.ToString(); } protected override void When() { result = controller.Edit(5, form); } [Test] public void is_retrieved_before_update_original_user() { userRepository.AssertWasCalled(x => x.GetById(5)); userRepository.AssertWasCalled(x => x.Update(retUser)); } } 

наслаждаться

Я нахожу, что долгая насмешливая процедура – это слишком много трений.

Лучший способ, который мы нашли – используя ASP.NET MVC для реального проекта, – это абстрагирование HttpContext к интерфейсу IWebContext, который просто проходит. Тогда вы можете издеваться над IWebContext без боли.

Вот пример

  • Использование Mockito для тестирования абстрактных classов
  • Logging, Aspect Oriented Programming и Injection Dependency Injection - Попытка понять все это
  • Как завершить работу программы при ее сбое? (который должен просто сбить единичный тест, а не застревать навсегда)
  • Настройка IntelliJ IDEA для модульного тестирования с помощью JUnit
  • Использование отражения для изменения статического финального файла File.separatorChar для модульного тестирования?
  • Как проверить, упорядочен ли список?
  • Использование диспетчера WPF в модульных тестах
  • программно добавить id в файл R.id
  • Как использовать Assert для проверки того, что было выбрано исключение?
  • Как я могу проверить события в угловом?
  • Можно ли издеваться над .NET HttpWebResponse?
  • Interesting Posts

    Как подписать APK с несколькими сертификатами?

    Аргументы командной строки Java

    Как получить максимальное разрешение на Ubuntu в Microsoft Virtual PC?

    Установка и сохранение настроек разрешения для дисплея, который не автоопределяется в KDE / Fedora 20

    Windows Repair Disc – откат драйвера из командной строки Windows? (Windows in evil Обновить цикл перезагрузки)

    Tcp-пакеты с использованием QTcpSocket

    Удаленный помощник для разрешения Windows 7 Starter Denied

    Как отключить отображение даты и времени в вертикальных расколах экрана GNU?

    Удаление каскадного стиля в Mongoose

    Что такое бит-маска?

    C ++ кросс-платформенный таймер с высоким разрешением

    Почему auto x {3} выводит список initializer_list?

    jQuery datepicker – 2 ввода / текстовые поля и ограничивающий диапазон

    Как создать удаленную ветку Git?

    Как преобразовать файл mkv в mp4 с субтитрами и сменить звук DTS на AAC или AC3?

    Давайте будем гением компьютера.