Как создать объект для HttpContext.Current.Request.Files и выполнить модульное тестирование? [Дубликат]

Ответ Алекс хороший. Но мне нравится правильное спаривание. По этой причине, если представление не нужно уведомлять, когда его даже не видно, я обычно добавляю уведомление в viewWillAppear и viewDidDisappear

8
задан Community 23 May 2017 в 12:02
поделиться

2 ответа

Web API создан для поддержки модульного тестирования, позволяя вам издеваться над различными объектами контекста. Однако, используя HttpContext.Current, вы используете код «старого стиля» System.Web, который использует класс HttpContext, который делает невозможным модульное тестирование вашего кода.

Чтобы ваш код был единицей вы должны остановить использование HttpContext.Current. В Отправка данных формы HTML в веб-API ASP.NET: загрузка файлов и многопользовательский MIME вы можете увидеть, как загружать файлы с помощью веб-API. Как ни странно, этот код также использует HttpContext.Current для доступа к MapPath, но в Web API вы должны использовать HostingEnvironment.MapPath, который также работает за пределами IIS.

Не используя HttpContext.Current, вы можете тестировать ваш контроллер, назначив свойство ControllerContext контроллера:

var content = new ByteArrayContent( /* bytes in the file */ );
content.Headers.Add("Content-Disposition", "form-data");
var controllerContext = new HttpControllerContext {
  Request = new HttpRequestMessage {
    Content = new MultipartContent { content }
  }
};
var controller = new MyController();
controller.ControllerContext = controllerContext;
20
ответ дан Martin Liversage 16 August 2018 в 05:15
поделиться
  • 1
    Благодарю за ваш ответ. Пожалуйста, см. Мое обновление выше о содержании. – AJ. 2 July 2015 в 21:35
  • 2
    @AJ: Я обновил код. Вы должны установить заголовок Content-Disposition для внутреннего содержимого, а не для содержимого с несколькими частями. – Martin Liversage 3 July 2015 в 07:52
  • 3
    @MartinLiversage - Я пытаюсь заставить это работать, и не очень повезло - если у вас есть время, вы можете взглянуть на это, пожалуйста? [Д0] stackoverflow.com/questions/44073646/… – Darren 19 May 2017 в 16:15

Принятый ответ идеально подходит для вопроса OP. Я хотел добавить мое решение здесь, которое происходит от Мартина, поскольку это страница, на которую я был направлен, когда просто искал, как выкачать объект Request для Web API, чтобы я мог добавлять заголовки, которые ищет мой контроллер. Мне было трудно найти простой ответ:

   var controllerContext = new HttpControllerContext();
   controllerContext.Request = new HttpRequestMessage();
   controllerContext.Request.Headers.Add("Accept", "application/xml");

   MyController controller = new MyController(MockRepository);
   controller.ControllerContext = controllerContext;

И вот вы; очень простой способ создать контекст контроллера, с помощью которого вы можете «отморозить» объект «Запрос» и предоставить правильные заголовки для вашего метода контроллера.

2
ответ дан iGanja 16 August 2018 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: