Как проводить модульное тестирование JsonResult и коллекций в MSTest

Я новичок в модульном тестировании, хотя кодировал очень давно. Я хочу сделать это частью своего пути развития. Я сталкиваюсь с блоками о том, как проводить модульное тестирование таких вещей, как коллекция. Обычно у меня есть сценарий jQuery, вызывающий методы на стороне сервера ASP.Net для получения данных, заполнения таблиц и т.п. Они выглядят как

Get_*Noun*() 

, который обычно возвращает JsonResult. Есть идеи, что и как их тестировать с помощью модульных тестов с использованием MSTest?

26
задан mithun_daa 29 November 2011 в 22:47
поделиться

5 ответов

Вы должны иметь возможность проверить это, как и все остальное, при условии, что вы можете извлечь значения из JsonResult. Вот помощник, который сделает это за вас:

private T GetValueFromJsonResult<T>(JsonResult jsonResult, string propertyName)
{
    var property =
        jsonResult.Data.GetType().GetProperties()
        .Where(p => string.Compare(p.Name, propertyName) == 0)
        .FirstOrDefault();

    if (null == property)
        throw new ArgumentException("propertyName not found", "propertyName");
    return (T)property.GetValue(jsonResult.Data, null);
}

Затем, как обычно, вызовите контроллер и проверьте результат с помощью этого помощника.

var jsonResult = yourController.YourAction(params);
bool testValue = GetValueFromJsonResult<bool>(jsonResult, "PropertyName");
Assert.IsFalse(testValue);
52
ответ дан 28 November 2019 в 06:19
поделиться

(я использую синтаксис NUnit, но MSUnit не должен быть далеко)

Вы можете проверить свой JsonResult следующим образом:

var json = Get_JsonResult()
dynamic data = json.Data;
Assert.AreEqual("value", data.MyValue)

Затем в проекте, который содержит код для тестирования отредактируйте файл AssemblyInfo.cs, чтобы разрешить тестируемой сборке доступ к анонимному типу:

[assembly: InternalsVisibleTo("Tests")]

Таким образом, динамический объект может определять тип анонимного объекта, возвращаемого из значения json.Data;

20
ответ дан 28 November 2019 в 06:19
поделиться

Этот - лучший блог, который я нашел на эту тему.

Моим любимым был 4-й подход с использованием динамики. Обратите внимание, что это требует от вас, чтобы внутренние компоненты были видимы для вашего тестового проекта, используя [assembly:InternalsVisibleTo("TestProject")], что, на мой взгляд, является достаточно хорошей идеей в целом.

[TestMethod]     
public void IndexTestWithDynamic()     
{     
    //arrange     
    HomeController controller = new HomeController();     

    //act     
    var result = controller.Index() as JsonResult;     

    //assert     
    dynamic data = result.Data;  

    Assert.AreEqual(3, data.Count);     
    Assert.IsTrue(data.Success);     
    Assert.AreEqual("Adam", data.People[0].Name);     
}
3
ответ дан 28 November 2019 в 06:19
поделиться

Вот небольшое расширение для простого преобразования Json ActionResult в объект, который он представляет.

using System.Web.Mvc;

public static class WebExtensions
{
     public static T ToJson<T>(this ActionResult actionResult)
     {
         var jsonResult = (JsonResult)actionResult;

         return (T)jsonResult.Data;
     }
}

При этом ваш «акт» в тесте становится меньше:

var myModel = myController.Action().ToJson<MyViewModel>();
0
ответ дан 28 November 2019 в 06:19
поделиться

Мое предложение состояло бы в том, чтобы создать модель для возвращаемых данных и затем привести результат в эту модель. Таким образом, вы можете проверить:

  1. структура верна
  2. данные в модели верны

    // Assert
    var result = action
        .AssertResultIs<JsonResult>();
    
    var model = (UIDSearchResults)result.Data;
    Assert.IsTrue(model.IsValid);
    Assert.AreEqual("ABC", model.UIDType);
    Assert.IsNull(model.CodeID);
    Assert.AreEqual(4, model.PossibleCodes.Count());
    
0
ответ дан 28 November 2019 в 06:19
поделиться
Другие вопросы по тегам:

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