public async Task Invoke_UsesDefaultValuesIfNotBound() { // Arrange var actionDescriptor = new ReflectedActionDescriptor { MethodInfo = typeof(TestController).GetTypeInfo() .DeclaredMethods .First(m => m.Name.Equals("ActionMethodWithDefaultValues", StringComparison.Ordinal)), Parameters = new List<ParameterDescriptor> { new ParameterDescriptor { Name = "value", ParameterBindingInfo = new ParameterBindingInfo("value", typeof(int)) } }, FilterDescriptors = new List<FilterDescriptor>() }; var binder = new Mock<IModelBinder>(); var metadataProvider = new EmptyModelMetadataProvider(); binder.Setup(b => b.BindModelAsync(It.IsAny<ModelBindingContext>())) .Returns(Task.FromResult(result: false)); var context = new Mock<HttpContext>(); context.SetupGet(c => c.Items) .Returns(new Dictionary<object, object>()); var routeContext = new RouteContext(context.Object); var actionContext = new ActionContext(routeContext, actionDescriptor); var bindingContext = new ActionBindingContext(actionContext, Mock.Of<IModelMetadataProvider>(), binder.Object, Mock.Of<IValueProvider>(), Mock.Of<IInputFormatterProvider>(), Enumerable.Empty<IModelValidatorProvider>()); var actionBindingContextProvider = new Mock<IActionBindingContextProvider>(); actionBindingContextProvider.Setup(p => p.GetActionBindingContextAsync(It.IsAny<ActionContext>())) .Returns(Task.FromResult(bindingContext)); var controllerFactory = new Mock<IControllerFactory>(); controllerFactory.Setup(c => c.CreateController(It.IsAny<ActionContext>())) .Returns(new TestController()); var invoker = new ReflectedActionInvoker(actionContext, actionDescriptor, controllerFactory.Object, actionBindingContextProvider.Object, Mock.Of<INestedProviderManager<FilterProviderContext>>()); // Act await invoker.InvokeActionAsync(); // Assert Assert.Equal(5, context.Object.Items["Result"]); }
public async Task GetActionArguments_DoesNotAddActionArgumentsToModelStateDictionary_IfBinderReturnsFalse() { // Arrange Func<object, int> method = x => 1; var actionDescriptor = new ReflectedActionDescriptor { MethodInfo = method.Method, Parameters = new List<ParameterDescriptor> { new ParameterDescriptor { Name = "foo", ParameterBindingInfo = new ParameterBindingInfo("foo", typeof(object)) } } }; var binder = new Mock<IModelBinder>(); binder.Setup(b => b.BindModelAsync(It.IsAny<ModelBindingContext>())) .Returns(Task.FromResult(result: false)); var actionContext = new ActionContext(new RouteContext(Mock.Of<HttpContext>()), actionDescriptor); var bindingContext = new ActionBindingContext(actionContext, Mock.Of<IModelMetadataProvider>(), binder.Object, Mock.Of<IValueProvider>(), Mock.Of<IInputFormatterProvider>(), Enumerable.Empty<IModelValidatorProvider>()); var actionBindingContextProvider = new Mock<IActionBindingContextProvider>(); actionBindingContextProvider.Setup(p => p.GetActionBindingContextAsync(It.IsAny<ActionContext>())) .Returns(Task.FromResult(bindingContext)); var invoker = new ReflectedActionInvoker(actionContext, actionDescriptor, Mock.Of<IControllerFactory>(), actionBindingContextProvider.Object, Mock.Of<INestedProviderManager<FilterProviderContext>>()); var modelStateDictionary = new ModelStateDictionary(); // Act var result = await invoker.GetActionArguments(modelStateDictionary); // Assert Assert.Empty(result); }
public async Task GetActionArguments_AddsActionArgumentsToModelStateDictionary_IfBinderReturnsTrue() { // Arrange Func<object, int> method = x => 1; var actionDescriptor = new ReflectedActionDescriptor { MethodInfo = method.Method, Parameters = new List<ParameterDescriptor> { new ParameterDescriptor { Name = "foo", ParameterBindingInfo = new ParameterBindingInfo("foo", typeof(object)) } } }; var value = "Hello world"; var binder = new Mock<IModelBinder>(); var metadataProvider = new EmptyModelMetadataProvider(); binder.Setup(b => b.BindModelAsync(It.IsAny<ModelBindingContext>())) .Callback((ModelBindingContext context) => { context.ModelMetadata = metadataProvider.GetMetadataForType(modelAccessor: null, modelType: typeof(string)); context.Model = value; }) .Returns(Task.FromResult(result: true)); var actionContext = new ActionContext(new RouteContext(Mock.Of<HttpContext>()), actionDescriptor); var bindingContext = new ActionBindingContext(actionContext, Mock.Of<IModelMetadataProvider>(), binder.Object, Mock.Of<IValueProvider>(), Mock.Of<IInputFormatterProvider>(), Enumerable.Empty<IModelValidatorProvider>()); var actionBindingContextProvider = new Mock<IActionBindingContextProvider>(); actionBindingContextProvider.Setup(p => p.GetActionBindingContextAsync(It.IsAny<ActionContext>())) .Returns(Task.FromResult(bindingContext)); var invoker = new ReflectedActionInvoker(actionContext, actionDescriptor, Mock.Of<IControllerFactory>(), actionBindingContextProvider.Object, Mock.Of<INestedProviderManager<FilterProviderContext>>()); var modelStateDictionary = new ModelStateDictionary(); // Act var result = await invoker.GetActionArguments(modelStateDictionary); // Assert Assert.Equal(1, result.Count); Assert.Equal(value, result["foo"]); }
private ReflectedActionInvoker CreateInvoker(IFilter[] filters, bool actionThrows = false) { var actionDescriptor = new ReflectedActionDescriptor() { FilterDescriptors = new List<FilterDescriptor>(), Parameters = new List<ParameterDescriptor>(), }; if (actionThrows) { actionDescriptor.MethodInfo = typeof(ReflectedActionInvokerTest).GetMethod("ThrowingActionMethod"); } else { actionDescriptor.MethodInfo = typeof(ReflectedActionInvokerTest).GetMethod("ActionMethod"); } var httpContext = new Mock<HttpContext>(MockBehavior.Loose); var httpResponse = new Mock<HttpResponse>(MockBehavior.Loose); httpContext.SetupGet(c => c.Response).Returns(httpResponse.Object); httpResponse.SetupGet(r => r.Body).Returns(new MemoryStream()); var actionContext = new ActionContext( httpContext: httpContext.Object, routeData: new RouteData(), actionDescriptor: actionDescriptor); var controllerFactory = new Mock<IControllerFactory>(); controllerFactory.Setup(c => c.CreateController(It.IsAny<ActionContext>())).Returns(this); var actionBindingContextProvider = new Mock<IActionBindingContextProvider>(MockBehavior.Strict); actionBindingContextProvider .Setup(abcp => abcp.GetActionBindingContextAsync(It.IsAny<ActionContext>())) .Returns(Task.FromResult(new ActionBindingContext(null, null, null, null, null, null))); var filterProvider = new Mock<INestedProviderManager<FilterProviderContext>>(MockBehavior.Strict); filterProvider .Setup(fp => fp.Invoke(It.IsAny<FilterProviderContext>())) .Callback<FilterProviderContext>( context => context.Results.AddRange(filters.Select(f => new FilterItem(null, f)))); var invoker = new ReflectedActionInvoker( actionContext, actionDescriptor, controllerFactory.Object, actionBindingContextProvider.Object, filterProvider.Object); return invoker; }