На основе трассировки стека это что-то в методе ViewResultBase.ExecuteResult
, которое выдает исключение.Используя рефлектор, вот определение этого метода:
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (string.IsNullOrEmpty(this.ViewName))
{
this.ViewName = context.RouteData.GetRequiredString("action");
}
ViewEngineResult result = null;
if (this.View == null)
{
result = this.FindView(context);
this.View = result.View;
}
TextWriter output = context.HttpContext.Response.Output;
ViewContext viewContext = new ViewContext(context, this.View, this.ViewData, this.TempData, output);
this.View.Render(viewContext, output);
if (result != null)
{
result.ViewEngine.ReleaseView(context, this.View);
}
}
На основе этого кода может возникнуть исключение ссылки на объект, когда код пытается получить доступ к свойству RouteData
из контекста (если имявида не было явно передано типу возврата).
Исключение может быть вызвано путем доступа к свойству HttpContext
.Я недостаточно хорошо использовал Moq, чтобы понять, может ли он справиться с тем фактом, что вы не сказали ему, как имитировать свойство HttpContext
, но вы сказали ему, как имитировать свойство Response
из HttpContext
Тип свойства, так что это еще одна область, которая вызывает у меня подозрение.
Все другие применения контекста в методе передают его в другие методы, которые, если бы это было проблемой, то трассировка стека выявила бы это.
Самый простой способ выяснить, какие из двух упомянутых мной проблем являются, я бы написал быстрый тест, чтобы извлечь эти свойства из ваших макетов и посмотреть, какое из них вызывает исключение.