Я не слишком беспокоюсь о возвращении Джонсона, как раньше. Природа AJAX, по-видимому, такова, что сообщение, которое вы хотите обработать в Javascript, применимо только к этой ситуации AJAX. Потребность AJAX в производительности просто должна как-то влиять на код. Возможно, вы не захотите возвращать те же данные другому клиенту.
Пара моментов, связанных с тестированием JSonResult, которые я заметил (и мне еще предстоит написать какие-либо тесты для моего приложения):
1) когда вы возвращаете JSonResult из вашего метода действия, который «получен» вашим тестовым методом, у вас все еще есть доступ к исходному объекту Data. Сначала это не было очевидно для меня (хотя и было несколько очевидно). Ответ Роба выше (или, возможно, ниже!) Использует этот факт, чтобы взять параметр Data и создать из него словарь. Если данные относятся к известному типу, то, конечно, вы можете привести их к этому типу.
Лично я только через AJAX возвращаю очень простые сообщения без какой-либо структуры. Я придумал метод расширения, который может быть полезен для тестирования, если у вас есть простое сообщение, созданное из анонимного типа. Если у вас есть более одного «уровня» для вашего объекта - вам, вероятно, лучше создать реальный класс для представления объекта JSon в любом случае, и в этом случае вы просто приводите jsonResult.Data
к этому типу.
Пример использования в первую очередь:
Метод действия:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ContactUsForm(FormCollection formData){
// process formData ...
var result = new JsonResult()
{
Data = new { success = true, message = "Thank you " + firstName }
};
return result;
}
Юнит-тест:
var result = controller.ContactUsForm(formsData);
if (result is JSonResult) {
var json = result as JsonResult;
bool success = json.GetProperty<bool>("success");
string message = json.GetProperty<string>("message");
// validate message and success are as expected
}
Затем вы можете запускать утверждения или все, что вы хотите в своем тесте. Кроме того, метод расширения будет генерировать исключения, если тип не соответствует ожидаемому.
Метод расширения:
public static TSource GetProperty<TSource>(this JsonResult json, string propertyName)
{
if (propertyName == null)
{
throw new ArgumentNullException("propertyName");
}
if (json.Data == null)
{
throw new ArgumentNullException("JsonResult.Data"); // what exception should this be?
}
// reflection time!
var propertyInfo = json.Data.GetType().GetProperty(propertyName);
if (propertyInfo == null) {
throw new ArgumentException("The property '" + propertyName + "' does not exist on class '" + json.Data.GetType() + "'");
}
if (propertyInfo.PropertyType != typeof(TSource))
{
throw new ArgumentException("The property '" + propertyName + "' was found on class '" + json.Data.GetType() + "' but was not of expected type '" + typeof(TSource).ToString());
}
var reflectedValue = (TSource) propertyInfo.GetValue(json.Data, null);
return reflectedValue;
}