Как смоделировать ActionExecutingContext с помощью moq - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь издеваться ActionExecutingContext за OnActionExecutionAsync.

Мне нужно написать тестовый блок для кода ниже.

public async Task OnActionExecutionAsync(
           ActionExecutingContext context,
           ActionExecutionDelegate next)
{
    var controllerInfo = actionExecutingcontext.ActionDescriptor as ControllerActionDescriptor;

    MyCustomAttribute[] myCustomAttribute = (MyCustomAttribute[])controllerInfo.MethodInfo.GetCustomAttributes(typeof(MyCustomAttribute), inherit: true);
}

Я нашел это Как смоделировать ActionExecutingContext с Moq? полезно, но это не объясняет, как смоделировать methodInfo и GetCustomAttributes.

1 Ответ

1 голос
/ 20 мая 2019

Недавно я столкнулся с подобной проблемой, пытаясь высмеять ActionDescriptor.FilterDescriptors. Поскольку вы используете MethodInfo, вам нужно решить его немного иначе, чем я. Это работает для меня без Мок. Это сводится к получению экземпляра MethodInfo, будь то реальный метод, фиктивный класс / метод с тем же атрибутом, который вы хотите проверить, или поддельное MethodInfo.

        private static ActionExecutingContext CreateActionExecutingContextTest()
        {
            Type t = typeof(TestClass);

            var activator = new ViewDataDictionaryControllerPropertyActivator(new EmptyModelMetadataProvider());
            var actionContext = new ActionContext(
                new DefaultHttpContext(),
                new RouteData(),
                new ControllerActionDescriptor()
                {
                    // Either Mock MethodInfo, feed in a fake class that has the attribute you want to test, or just feed in
                    MethodInfo = t.GetMethod(nameof(TestClass.TestMethod))
                });
            var controllerContext = new ControllerContext(actionContext);
            var controller = new TestController()
            {
                ControllerContext = controllerContext
            };

            activator.Activate(controllerContext, controller);

            return new ActionExecutingContext(
                actionContext,
                new List<IFilterMetadata>(),
                new Dictionary<string, object>(),
                controller);
        }

        public class TestClass
        {
            [MyCustomAttribute]
            public void TestMethod()
            {
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...