Я новичок в модульном тестировании, хотя кодировал очень давно. Я хочу сделать это частью своего пути развития. Я сталкиваюсь с блоками о том, как проводить модульное тестирование таких вещей, как коллекция. Обычно у меня есть сценарий jQuery, вызывающий методы на стороне сервера ASP.Net для получения данных, заполнения таблиц и т.п. Они выглядят как
Get_*Noun*()
, который обычно возвращает JsonResult. Есть идеи, что и как их тестировать с помощью модульных тестов с использованием MSTest?
Вы должны иметь возможность проверить это, как и все остальное, при условии, что вы можете извлечь значения из 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);
(я использую синтаксис NUnit, но MSUnit не должен быть далеко)
Вы можете проверить свой JsonResult следующим образом:
var json = Get_JsonResult()
dynamic data = json.Data;
Assert.AreEqual("value", data.MyValue)
Затем в проекте, который содержит код для тестирования отредактируйте файл AssemblyInfo.cs, чтобы разрешить тестируемой сборке доступ к анонимному типу:
[assembly: InternalsVisibleTo("Tests")]
Таким образом, динамический объект может определять тип анонимного объекта, возвращаемого из значения json.Data;
Этот - лучший блог, который я нашел на эту тему.
Моим любимым был 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);
}
Вот небольшое расширение для простого преобразования 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>();
Мое предложение состояло бы в том, чтобы создать модель для возвращаемых данных и затем привести результат в эту модель. Таким образом, вы можете проверить:
данные в модели верны
// 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());