private static ViewComponentContext GetViewComponentContext(IView view, Stream stream) { var actionContext = new ActionContext(GetHttpContext(), new RouteData(), new ActionDescriptor()); var viewData = new ViewDataDictionary(new EmptyModelMetadataProvider()); var viewContext = new ViewContext( actionContext, view, viewData, Mock.Of<ITempDataDictionary>(), TextWriter.Null, new HtmlHelperOptions()); var writer = new StreamWriter(stream) { AutoFlush = true }; var viewComponentDescriptor = new ViewComponentDescriptor() { Type = typeof(object), }; var viewComponentContext = new ViewComponentContext( viewComponentDescriptor, new Dictionary<string, object>(), new HtmlTestEncoder(), viewContext, writer); return viewComponentContext; }
private async Task <IHtmlContent> InvokeCoreAsync( ViewComponentDescriptor descriptor, object arguments) { var viewBuffer = new ViewBuffer(_viewBufferScope, descriptor.FullName); using (var writer = new HtmlContentWrapperTextWriter(viewBuffer, _viewContext.Writer.Encoding)) { var context = new ViewComponentContext( descriptor, PropertyHelper.ObjectToDictionary(arguments), _htmlEncoder, _viewContext, writer); var invoker = _invokerFactory.CreateInstance(context); if (invoker == null) { throw new InvalidOperationException( Resources.FormatViewComponent_IViewComponentFactory_ReturnedNull(descriptor.FullName)); } await invoker.InvokeAsync(context); return(writer.ContentBuilder); } }
private void InvokeCore( TextWriter writer, ViewComponentDescriptor descriptor, object[] arguments) { if (writer == null) { throw new ArgumentNullException(nameof(writer)); } if (descriptor == null) { throw new ArgumentNullException(nameof(descriptor)); } var context = new ViewComponentContext(descriptor, arguments, _viewContext, writer); var invoker = _invokerFactory.CreateInstance(context); if (invoker == null) { throw new InvalidOperationException( Resources.FormatViewComponent_IViewComponentFactory_ReturnedNull(descriptor.Type.FullName)); } invoker.Invoke(context); }
public async Task ExecuteAsync_ViewComponentResult_AllowsNullViewDataAndTempData() { // Arrange var descriptor = new ViewComponentDescriptor() { FullName = "Full.Name.Text", ShortName = "Text", Type = typeof(TextViewComponent), MethodInfo = typeof(TextViewComponent).GetMethod(nameof(TextViewComponent.Invoke)), }; var actionContext = CreateActionContext(descriptor); var viewComponentResult = new ViewComponentResult { Arguments = new { name = "World!" }, ViewData = null, TempData = null, ViewComponentName = "Text" }; // Act await viewComponentResult.ExecuteResultAsync(actionContext); // No assert, just confirm it didn't throw }
/// <inheritdoc /> // We don't currently make use of the descriptor or the arguments here (they are available on the context). // We might do this some day to cache which method we select, so resist the urge to 'clean' this without // considering that possibility. public IViewComponentInvoker CreateInstance( [NotNull] ViewComponentDescriptor viewComponentDescriptor, object[] args) { return(new DefaultViewComponentInvoker( _serviceProvider, _typeActivatorCache, _viewComponentActivator)); }
private static ViewComponentDescriptor CreateCandidate(TypeInfo typeInfo) { var candidate = new ViewComponentDescriptor() { FullName = ViewComponentConventions.GetComponentFullName(typeInfo), ShortName = ViewComponentConventions.GetComponentName(typeInfo), Type = typeInfo.AsType(), }; return(candidate); }
private static ViewComponentDescriptor CreateCandidate(TypeInfo typeInfo) { var candidate = new ViewComponentDescriptor() { FullName = ViewComponentConventions.GetComponentFullName(typeInfo), ShortName = ViewComponentConventions.GetComponentName(typeInfo), Type = typeInfo.AsType(), }; return candidate; }
private static ViewComponentDescriptor CreateDescriptor(TypeInfo typeInfo) { var type = typeInfo.AsType(); var candidate = new ViewComponentDescriptor { FullName = ViewComponentConventions.GetComponentFullName(typeInfo), ShortName = ViewComponentConventions.GetComponentName(typeInfo), Type = type, MethodInfo = FindMethod(type) }; return candidate; }
private static ViewComponentDescriptor CreateDescriptor(TypeInfo typeInfo) { var type = typeInfo.AsType(); var candidate = new ViewComponentDescriptor { FullName = ViewComponentConventions.GetComponentFullName(typeInfo), ShortName = ViewComponentConventions.GetComponentName(typeInfo), Type = type, MethodInfo = FindMethod(type) }; return(candidate); }
private static ViewComponentContext GetViewComponentContext(IView view, Stream stream) { var actionContext = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor()); var viewData = new ViewDataDictionary(new EmptyModelMetadataProvider()); var viewContext = new ViewContext(actionContext, view, viewData, null, TextWriter.Null); var writer = new StreamWriter(stream) { AutoFlush = true }; var viewComponentDescriptor = new ViewComponentDescriptor() { Type = typeof(object), }; var viewComponentContext = new ViewComponentContext(viewComponentDescriptor, new object[0], viewContext, writer); return viewComponentContext; }
private async Task InvokeCoreAsync( [NotNull] TextWriter writer, [NotNull] ViewComponentDescriptor descriptor, object[] arguments) { var invoker = _invokerFactory.CreateInstance(descriptor, arguments); if (invoker == null) { throw new InvalidOperationException( Resources.FormatViewComponent_IViewComponentFactory_ReturnedNull(descriptor.Type.FullName)); } var context = new ViewComponentContext(descriptor, arguments, _viewContext, writer); await invoker.InvokeAsync(context); }
/// <summary> /// Creates a new <see cref="ViewComponentContext"/>. /// </summary> /// <param name="viewComponentDescriptor"> /// The <see cref="ViewComponentContext"/> for the view component being invoked. /// </param> /// <param name="arguments">The view component arguments.</param> /// <param name="viewContext">The <see cref="ViewContext"/>.</param> /// <param name="writer">The <see cref="TextWriter"/> for writing output.</param> public ViewComponentContext( ViewComponentDescriptor viewComponentDescriptor, IDictionary <string, object> arguments, HtmlEncoder htmlEncoder, ViewContext viewContext, TextWriter writer) { if (viewComponentDescriptor == null) { throw new ArgumentNullException(nameof(viewComponentDescriptor)); } if (arguments == null) { throw new ArgumentNullException(nameof(arguments)); } if (htmlEncoder == null) { throw new ArgumentNullException(nameof(htmlEncoder)); } if (viewContext == null) { throw new ArgumentNullException(nameof(viewContext)); } if (writer == null) { throw new ArgumentNullException(nameof(writer)); } ViewComponentDescriptor = viewComponentDescriptor; Arguments = arguments; HtmlEncoder = htmlEncoder; // We want to create a defensive copy of the VDD here so that changes done in the VC // aren't visible in the calling view. ViewContext = new ViewContext( viewContext, viewContext.View, new ViewDataDictionary(viewContext.ViewData), writer); }
/// <summary> /// Creates a new <see cref="ViewComponentContext"/>. /// </summary> /// <param name="viewComponentDescriptor"> /// The <see cref="ViewComponentContext"/> for the view component being invoked. /// </param> /// <param name="arguments">The view component arguments.</param> /// <param name="viewContext">The <see cref="ViewContext"/>.</param> /// <param name="writer">The <see cref="TextWriter"/> for writing output.</param> public ViewComponentContext( ViewComponentDescriptor viewComponentDescriptor, IDictionary<string, object> arguments, HtmlEncoder htmlEncoder, ViewContext viewContext, TextWriter writer) { if (viewComponentDescriptor == null) { throw new ArgumentNullException(nameof(viewComponentDescriptor)); } if (arguments == null) { throw new ArgumentNullException(nameof(arguments)); } if (htmlEncoder == null) { throw new ArgumentNullException(nameof(htmlEncoder)); } if (viewContext == null) { throw new ArgumentNullException(nameof(viewContext)); } if (writer == null) { throw new ArgumentNullException(nameof(writer)); } ViewComponentDescriptor = viewComponentDescriptor; Arguments = arguments; HtmlEncoder = htmlEncoder; // We want to create a defensive copy of the VDD here so that changes done in the VC // aren't visible in the calling view. ViewContext = new ViewContext( viewContext, viewContext.View, new ViewDataDictionary(viewContext.ViewData), writer); }
public async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { var result = await InvokeAsync(Count); var writer = new StringWriter(); var viewComponentDescriptor = new ViewComponentDescriptor() { Type = typeof(TagCloudViewComponentTagHelper), ShortName = "TagCloudViewComponentTagHelper", FullName = "TagCloudViewComponentTagHelper", }; await result.ExecuteAsync(new ViewComponentContext( viewComponentDescriptor, new object[0], ViewContext, writer)); output.TagName = null; output.Content.AppendHtml(writer.ToString()); }
public async Task ViewComponentResult_SetsContentTypeHeader_OverrideResponseContentType() { // Arrange var descriptor = new ViewComponentDescriptor() { FullName = "Full.Name.Text", ShortName = "Text", Type = typeof(TextViewComponent), MethodInfo = typeof(TextViewComponent).GetMethod(nameof(TextViewComponent.Invoke)), }; var actionContext = CreateActionContext(descriptor); var expectedContentType = "text/html; charset=utf-8"; actionContext.HttpContext.Response.ContentType = "application/x-will-be-overridden"; var viewComponentResult = new ViewComponentResult() { Arguments = new { name = "World!" }, ViewComponentName = "Text", ContentType = new MediaTypeHeaderValue("text/html") { Encoding = Encoding.UTF8 }, TempData = _tempDataDictionary, }; // Act await viewComponentResult.ExecuteResultAsync(actionContext); // Assert Assert.Equal(expectedContentType, actionContext.HttpContext.Response.ContentType); }
public void CreateTagHelper(ViewComponentDescriptor viewComponentDescriptor) { var tagHelperName = $"{viewComponentDescriptor.Type.Namespace}.{viewComponentDescriptor.ShortName}VC{TagHelperName}"; var typeBuilder = _moduleBuilder.CreateTagHelperType<GeneratedViewComponentTagHelperProxy>(tagHelperName); var constructor = typeBuilder.DefineConstructor( MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.RTSpecialName | MethodAttributes.SpecialName, CallingConventions.Standard, new[] { typeof(IViewComponentHelper) }); var constructorILGenerator = constructor.GetILGenerator(); constructorILGenerator.Emit(OpCodes.Ldarg_0); constructorILGenerator.Emit(OpCodes.Ldarg_1); constructorILGenerator.Emit(OpCodes.Call, BaseConstuctor); constructorILGenerator.Emit(OpCodes.Ret); var processBuilder = typeBuilder.DefineMethod( nameof(TagHelper.Process), MethodAttributes.Public | MethodAttributes.ReuseSlot | MethodAttributes.Virtual | MethodAttributes.HideBySig, CallingConventions.HasThis, typeof(void), new[] { typeof(TagHelperContext), typeof(TagHelperOutput) }); var methodInfo = viewComponentDescriptor.Type.GetMethod("Invoke"); var methodParameters = methodInfo.GetParameters(); var parameterCount = methodParameters.Length; var processILGenerator = processBuilder.GetILGenerator(); processILGenerator.Emit(OpCodes.Ldc_I4, parameterCount); processILGenerator.Emit(OpCodes.Newarr, typeof(object)); processILGenerator.Emit(OpCodes.Dup); for (var i = 0; i < parameterCount; i++) { var parameterInfo = methodParameters[i]; var propertyBuilder = typeBuilder.DefineProperty( parameterInfo.Name, PropertyAttributes.HasDefault, parameterInfo.ParameterType, null); var getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig; var backingFieldBuilder = typeBuilder.DefineField( "m_" + parameterInfo.Name.ToLower(), parameterInfo.ParameterType, FieldAttributes.Private); var getMethodBuilder = typeBuilder.DefineMethod( "get_" + parameterInfo.Name, getSetAttr, parameterInfo.ParameterType, Type.EmptyTypes); var getMethodILGenerator = getMethodBuilder.GetILGenerator(); getMethodILGenerator.Emit(OpCodes.Ldarg_0); getMethodILGenerator.Emit(OpCodes.Ldfld, backingFieldBuilder); getMethodILGenerator.Emit(OpCodes.Ret); // Define the "set" accessor method for Number, which has no return var setMethodBuilder = typeBuilder.DefineMethod( "set_" + parameterInfo.Name, getSetAttr, null, new Type[] { parameterInfo.ParameterType }); ILGenerator setMethodILGenerator = setMethodBuilder.GetILGenerator(); setMethodILGenerator.Emit(OpCodes.Ldarg_0); setMethodILGenerator.Emit(OpCodes.Ldarg_1); setMethodILGenerator.Emit(OpCodes.Stfld, backingFieldBuilder); setMethodILGenerator.Emit(OpCodes.Ret); // The property is now complete. propertyBuilder.SetGetMethod(getMethodBuilder); propertyBuilder.SetSetMethod(setMethodBuilder); // Update our params array that's used to execute the view component. processILGenerator.Emit(OpCodes.Ldc_I4, i); processILGenerator.Emit(OpCodes.Ldarg_0); processILGenerator.EmitCall(OpCodes.Call, propertyBuilder.GetMethod, null); processILGenerator.Emit(OpCodes.Box, parameterInfo.ParameterType); processILGenerator.Emit(OpCodes.Stelem_Ref); processILGenerator.Emit(OpCodes.Dup); } var arrayValue = processILGenerator.DeclareLocal(typeof(object[])); processILGenerator.Emit(OpCodes.Stloc, arrayValue); processILGenerator.Emit(OpCodes.Ldarg_0); processILGenerator.Emit(OpCodes.Ldarg_2); processILGenerator.Emit(OpCodes.Ldloc, arrayValue); var baseExecuteMethodInfo = BaseExecute.MakeGenericMethod(viewComponentDescriptor.Type); processILGenerator.EmitCall(OpCodes.Call, baseExecuteMethodInfo, null); processILGenerator.Emit(OpCodes.Ret); }
public async Task ViewComponentResult_SetsContentTypeHeader( MediaTypeHeaderValue contentType, string expectedContentTypeHeaderValue) { // Arrange var descriptor = new ViewComponentDescriptor() { FullName = "Full.Name.Text", ShortName = "Text", Type = typeof(TextViewComponent), MethodInfo = typeof(TextViewComponent).GetMethod(nameof(TextViewComponent.Invoke)), }; var actionContext = CreateActionContext(descriptor); var contentTypeBeforeViewResultExecution = contentType?.ToString(); var viewComponentResult = new ViewComponentResult() { Arguments = new { name = "World!" }, ViewComponentName = "Text", ContentType = contentType, TempData = _tempDataDictionary, }; // Act await viewComponentResult.ExecuteResultAsync(actionContext); // Assert Assert.Equal(expectedContentTypeHeaderValue, actionContext.HttpContext.Response.ContentType); // Check if the original instance provided by the user has not changed. // Since we do not have access to the new instance created within the view executor, // check if at least the content is the same. var contentTypeAfterViewResultExecution = contentType?.ToString(); Assert.Equal(contentTypeBeforeViewResultExecution, contentTypeAfterViewResultExecution); }
public async Task ExecuteResultAsync_ExecutesViewComponent_ByType() { // Arrange var descriptor = new ViewComponentDescriptor() { FullName = "Full.Name.Text", ShortName = "Text", Type = typeof(TextViewComponent), MethodInfo = typeof(TextViewComponent).GetMethod(nameof(TextViewComponent.Invoke)), }; var actionContext = CreateActionContext(descriptor); var viewComponentResult = new ViewComponentResult() { Arguments = new { name = "World!" }, ViewComponentType = typeof(TextViewComponent), TempData = _tempDataDictionary, }; // Act await viewComponentResult.ExecuteResultAsync(actionContext); // Assert var body = ReadBody(actionContext.HttpContext.Response); Assert.Equal("Hello, World!", body); }
public async Task ExecuteResultAsync_SetsStatusCode() { // Arrange var descriptor = new ViewComponentDescriptor() { FullName = "Full.Name.Text", ShortName = "Text", Type = typeof(TextViewComponent), MethodInfo = typeof(TextViewComponent).GetMethod(nameof(TextViewComponent.Invoke)) }; var actionContext = CreateActionContext(descriptor); var viewComponentResult = new ViewComponentResult() { Arguments = new { name = "World!" }, ViewComponentType = typeof(TextViewComponent), StatusCode = 404, TempData = _tempDataDictionary, }; // Act await viewComponentResult.ExecuteResultAsync(actionContext); // Assert Assert.Equal(404, actionContext.HttpContext.Response.StatusCode); }
public async Task ExecuteResultAsync_ExecutesSyncViewComponent() { // Arrange var descriptor = new ViewComponentDescriptor() { FullName = "Full.Name.Text", ShortName = "Text", Type = typeof(TextViewComponent), }; var actionContext = CreateActionContext(descriptor); var viewComponentResult = new ViewComponentResult() { Arguments = new object[] { "World!" }, ViewComponentName = "Text", }; // Act await viewComponentResult.ExecuteResultAsync(actionContext); // Assert var body = ReadBody(actionContext.HttpContext.Response); Assert.Equal("Hello, World!", body); }
public async Task ExecuteResultAsync_ExecutesViewComponent_AndWritesDiagnosticSource() { // Arrange var descriptor = new ViewComponentDescriptor() { FullName = "Full.Name.Text", ShortName = "Text", Type = typeof(TextViewComponent), MethodInfo = typeof(TextViewComponent).GetMethod(nameof(TextViewComponent.Invoke)), }; var adapter = new TestDiagnosticListener(); var actionContext = CreateActionContext(adapter, descriptor); var viewComponentResult = new ViewComponentResult() { Arguments = new { name = "World!" }, ViewComponentName = "Text", TempData = _tempDataDictionary, }; // Act await viewComponentResult.ExecuteResultAsync(actionContext); // Assert var body = ReadBody(actionContext.HttpContext.Response); Assert.Equal("Hello, World!", body); Assert.NotNull(adapter.BeforeViewComponent?.ActionDescriptor); Assert.NotNull(adapter.BeforeViewComponent?.ViewComponentContext); Assert.NotNull(adapter.BeforeViewComponent?.ViewComponent); Assert.NotNull(adapter.AfterViewComponent?.ActionDescriptor); Assert.NotNull(adapter.AfterViewComponent?.ViewComponentContext); Assert.NotNull(adapter.AfterViewComponent?.ViewComponentResult); Assert.NotNull(adapter.AfterViewComponent?.ViewComponent); }
private async Task<IHtmlContent> InvokeCoreAsync( ViewComponentDescriptor descriptor, object arguments) { var viewBuffer = new ViewBuffer(_viewBufferScope, descriptor.FullName); using (var writer = new HtmlContentWrapperTextWriter(viewBuffer, _viewContext.Writer.Encoding)) { var context = new ViewComponentContext( descriptor, PropertyHelper.ObjectToDictionary(arguments), _htmlEncoder, _viewContext, writer); var invoker = _invokerFactory.CreateInstance(context); if (invoker == null) { throw new InvalidOperationException( Resources.FormatViewComponent_IViewComponentFactory_ReturnedNull(descriptor.FullName)); } await invoker.InvokeAsync(context); return writer.ContentBuilder; } }
public ViewComponentLogScope(ViewComponentDescriptor descriptor) { _descriptor = descriptor; }
/// <summary> /// Creates a new <see cref="ViewComponentContext"/>. /// </summary> /// <remarks> /// The default constructor is provided for unit test purposes only. /// </remarks> public ViewComponentContext() { ViewComponentDescriptor = new ViewComponentDescriptor(); Arguments = new object[0]; ViewContext = new ViewContext(); }
public async Task ViewComponentResult_NoContentTypeSet_PreservesResponseContentType( string responseContentType, string expectedContentType) { // Arrange var descriptor = new ViewComponentDescriptor() { FullName = "Full.Name.Text", ShortName = "Text", Type = typeof(TextViewComponent), MethodInfo = typeof(TextViewComponent).GetMethod(nameof(TextViewComponent.Invoke)), }; var actionContext = CreateActionContext(descriptor); actionContext.HttpContext.Response.ContentType = expectedContentType; var viewComponentResult = new ViewComponentResult() { Arguments = new { name = "World!" }, ViewComponentName = "Text", TempData = _tempDataDictionary, }; // Act await viewComponentResult.ExecuteResultAsync(actionContext); // Assert Assert.Equal(expectedContentType, actionContext.HttpContext.Response.ContentType); }
private static ViewComponentContext GetViewComponentContext( IView view, ViewDataDictionary viewData, object diagnosticListener = null) { var diagnosticSource = new DiagnosticListener("Microsoft.AspNet"); if (diagnosticListener == null) { diagnosticListener = new TestDiagnosticListener(); } diagnosticSource.SubscribeWithAdapter(diagnosticListener); var serviceProvider = new Mock<IServiceProvider>(); serviceProvider.Setup(s => s.GetService(typeof(DiagnosticSource))).Returns(diagnosticSource); var httpContext = new DefaultHttpContext(); httpContext.RequestServices = serviceProvider.Object; var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var viewContext = new ViewContext( actionContext, view, viewData, new TempDataDictionary(httpContext, new SessionStateTempDataProvider()), TextWriter.Null, new HtmlHelperOptions()); var viewComponentDescriptor = new ViewComponentDescriptor() { ShortName = "Invoke", Type = typeof(object), MethodInfo = typeof(object).GetTypeInfo().DeclaredMethods.First() }; var viewComponentContext = new ViewComponentContext( viewComponentDescriptor, new Dictionary<string, object>(), new HtmlTestEncoder(), viewContext, TextWriter.Null); return viewComponentContext; }
/// <summary> /// Creates a new <see cref="ViewComponentContext"/>. /// </summary> /// <remarks> /// The default constructor is provided for unit test purposes only. /// </remarks> public ViewComponentContext() { ViewComponentDescriptor = new ViewComponentDescriptor(); Arguments = new object[0]; ViewContext = new ViewContext(); }
/// <summary> /// Creates a new <see cref="ViewComponentContext"/>. /// </summary> /// <remarks> /// The default constructor is provided for unit test purposes only. /// </remarks> public ViewComponentContext() { ViewComponentDescriptor = new ViewComponentDescriptor(); ViewContext = new ViewContext(); }
private static ViewComponentContext GetViewComponentContext(IView view, ViewDataDictionary viewData) { var actionContext = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor()); var viewContext = new ViewContext( actionContext, view, viewData, null, TextWriter.Null, new HtmlHelperOptions()); var viewComponentDescriptor = new ViewComponentDescriptor() { Type = typeof(object), }; var viewComponentContext = new ViewComponentContext( viewComponentDescriptor, new object[0], viewContext, TextWriter.Null); return viewComponentContext; }
private void InvokeCore( TextWriter writer, ViewComponentDescriptor descriptor, object[] arguments) { if (writer == null) { throw new ArgumentNullException(nameof(writer)); } if (descriptor == null) { throw new ArgumentNullException(nameof(descriptor)); } var context = new ViewComponentContext(descriptor, arguments, _viewContext, writer); var invoker = _invokerFactory.CreateInstance(context); if (invoker == null) { throw new InvalidOperationException( Resources.FormatViewComponent_IViewComponentFactory_ReturnedNull(descriptor.Type.FullName)); } invoker.Invoke(context); }
/// <summary> /// Creates a new <see cref="ViewComponentContext"/>. /// </summary> /// <remarks> /// The default constructor is provided for unit test purposes only. /// </remarks> public ViewComponentContext() { ViewComponentDescriptor = new ViewComponentDescriptor(); ViewContext = new ViewContext(); }
public async Task ExecuteResultAsync_SetsStatusCode() { // Arrange var descriptor = new ViewComponentDescriptor() { FullName = "Full.Name.Text", ShortName = "Text", Type = typeof(TextViewComponent), }; var actionContext = CreateActionContext(descriptor); var viewComponentResult = new ViewComponentResult() { Arguments = new object[] { "World!" }, ViewComponentType = typeof(TextViewComponent), StatusCode = 404, }; // Act await viewComponentResult.ExecuteResultAsync(actionContext); // Assert Assert.Equal(404, actionContext.HttpContext.Response.StatusCode); }
public async Task ViewComponentResult_NoContentTypeSet_PreservesResponseContentType() { // Arrange var descriptor = new ViewComponentDescriptor() { FullName = "Full.Name.Text", ShortName = "Text", Type = typeof(TextViewComponent), }; var actionContext = CreateActionContext(descriptor); var expectedContentType = "application/x-will-not-be-overridden"; actionContext.HttpContext.Response.ContentType = expectedContentType; var viewComponentResult = new ViewComponentResult() { Arguments = new object[] { "World!" }, ViewComponentName = "Text", TempData = _tempDataDictionary, }; // Act await viewComponentResult.ExecuteResultAsync(actionContext); // Assert Assert.Equal(expectedContentType, actionContext.HttpContext.Response.ContentType); }
private static ViewComponentContext GetViewComponentContext(IView view, ViewDataDictionary viewData, object diagnosticListener = null) { var diagnosticSource = new DiagnosticListener("Microsoft.AspNet"); if (diagnosticListener == null) { diagnosticListener = new TestDiagnosticListener(); } diagnosticSource.SubscribeWithAdapter(diagnosticListener); var serviceProvider = new Mock<IServiceProvider>(); serviceProvider.Setup(s => s.GetService(typeof(DiagnosticSource))).Returns(diagnosticSource); var httpContext = new DefaultHttpContext(); httpContext.RequestServices = serviceProvider.Object; var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var viewContext = new ViewContext( actionContext, view, viewData, new TempDataDictionary(new HttpContextAccessor(), new SessionStateTempDataProvider()), TextWriter.Null, new HtmlHelperOptions()); var viewComponentDescriptor = new ViewComponentDescriptor() { Type = typeof(object), }; var viewComponentContext = new ViewComponentContext( viewComponentDescriptor, new object[0], viewContext, TextWriter.Null); return viewComponentContext; }