Вероятно, это изменение в реализации System.Web.Mvc.JsonValueProviderFactory.GetValueProvider
, которое достигает значения в ControllerContext
, которое является нулевым.
Возможно, вам потребуется смоделировать дополнительное значение в ControllerContext
.
По крайней мере, это то, куда я бы посмотрел первым.
РЕДАКТИРОВАТЬ
Да, похоже, что он делает нулевую проверку на controllerContext
.
public override IValueProvider GetValueProvider(ControllerContext controllerContext)
{
if (controllerContext == null)
{
throw new ArgumentNullException("controllerContext");
}
object deserializedObject = GetDeserializedObject(controllerContext);
if (deserializedObject == null)
{
return null;
}
Dictionary<string, object> backingStore = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
AddToBackingStore(backingStore, string.Empty, deserializedObject);
return new DictionaryValueProvider<object>(backingStore, CultureInfo.CurrentCulture);
}
Из трассировки стека видно, что TryUpdateModel[TModel](TModel model, String prefix)
.Используя отражатель, он получает доступ к свойству ControllerBase
ValueProvider
.Это в свою очередь вызывает ValueProviderFactoryCollection.GetValueProvider(ControllerContext controllerContext)
с текущим свойством Controllers ControllerContext
.
Вы должны просто иметь возможность создать новый экземпляр ControllerContext
и соответственно установить свойство контроллера ...
[TestMethod]
public void EditTest
{
var controller = new Controller();
var controllerContext = new ControllerContext();
controller.ControllerContext = controllerContext;
controller.Edit(...);
}
Может потребоваться некоторая дополнительная насмешка, чтобы заставить его полноценно функционировать.Некоторая информация о том, как полностью смоделировать ControllerContext: Mocking Контекст контроллера Asp.net-mvc