Я бы создал ModelBinder, который понимает CookieData и как получить его из объекта Request. Я боюсь, что код создания модульного теста необходим, чтобы сделать конструктор счастливым. Если вы возьмете его в качестве параметра для контроллера с помощью связывателя модели, вы можете избежать этих накладных расходов на тестирование.
public class SomeController : Controller
{
// only need to pass in the data object for unit testing.
// ModelBinder takes care of DRY
public ActionResult Index(CookieData cookieData)
{
}
}
Ответом на то, почему это не работает в конструкторе, является то, что Controller не был инициализирован с ControllerContext в этот момент.
public HttpContextBase HttpContext {
get {
return ControllerContext == null
? null
: ControllerContext.HttpContext;
}
}
Если вы действительно хотите сделать это в конструкторе (не), тогда используйте HttpContext.Request вместо оболочки. Но тем самым вы сделаете свой код непроверяемым, а выравнивание снизится на 3 пункта.