Я пишу, чтобы протестировать сложный класс со сложными вложенными вычислениями. Мы смотрим на ActionMethod и его returnType. ReturnType - сложное уравнение, как бы я его высмеял?
var methodInfoMock = new Mock<MethodInfo>();
var actionModel = new ActionModel(methodInfoMock.Object, new List<object>(){});
Мы знаем, как насмехаться над ActionModel, но не его returnType. Поэтому мы сохраняем его как собственную переменную.
Если мы не знаем, как смоделировать сложные вычисления, лучше ли просто оставить их в качестве собственной переменной или члена класса?
public void AddProducesResponseTypeAttribute(ActionModel action, Type returnType, int statusCodeResult)
{
if (returnType != null)
{
action.Filters.Add(new ProducesResponseTypeAttribute(returnType, statusCodeResult));
}
else if (returnType == null)
{
action.Filters.Add(new ProducesResponseTypeAttribute(statusCodeResult));
}
}
}
См. Уравнение для returnType Ниже,
foreach (ActionModel action in controller.Actions)
{
Type returnType = null;
if (action.ActionMethod.ReturnType.GenericTypeArguments.Any())
{
if (action.ActionMethod.ReturnType.GenericTypeArguments[0].GetGenericArguments().Any())
{
returnType = action.ActionMethod.ReturnType.GenericTypeArguments[0].GetGenericArguments()[0]
;
В любом случае, у нас работает тест, просто returnType висит там сам по себе.
Окончательный результат:
[Theory]
[InlineData(200, typeof(IActionResult))]
[InlineData(500, typeof(IActionResult))]
public void TestAddProducesResponseType(int expectedStatusCode, Type returnType)
{
// Arrange
var provider = new ProduceResponseTypeModelProvider();
var methodInfoMock = new Mock<MethodInfo>();
var actionModel = new ActionModel(methodInfoMock.Object, new List<object>() { });
// Act
provider.AddProducesResponseTypeAttribute(actionModel, returnType, expectedStatusCode);
// Assert
actionModel.Filters.ShouldContain(new ProducesResponseTypeAttribute(returnType, expectedStatusCode));
}