public void WithViewContextWithoutValidationSummaryMessageElementShouldSetItToAccessor()
        {
            var mvcOptions = new MvcViewOptions()
            {
                HtmlHelperOptions = new HtmlHelperOptions()
            };

            mvcOptions.HtmlHelperOptions.ValidationSummaryMessageElement = "Test";

            MyApplication
            .StartsFrom <DefaultStartup>()
            .WithServices(services =>
            {
                services.AddSingleton(mvcOptions);
                services.AddSingleton <IActionContextAccessor, ActionContextAccessor>();
            });

            MyViewComponent <AccessorComponent>
            .Instance()
            .WithViewContext(viewContext =>
            {
                viewContext.ValidationSummaryMessageElement = null;
            })
            .ShouldPassForThe <AccessorComponent>(viewComponent =>
            {
                Assert.NotNull(viewComponent.ViewContext.ValidationSummaryMessageElement);
                Assert.True(viewComponent.ViewContext.ValidationSummaryMessageElement == "Test");
            });

            MyApplication.StartsFrom <DefaultStartup>();
        }
Exemplo n.º 2
0
        public PageActionInvoker(
            DiagnosticListener diagnosticSource,
            ILogger logger,
            IPageFactory factory,
            IPageModelFactory modelFactory,
            IPageHandlerMethodSelector selector,
            IModelMetadataProvider metadataProvider,
            ITempDataDictionaryFactory tempDataFactory,
            IOptions <MvcViewOptions> viewOptions,
            IFilterMetadata[] filters,
            IReadOnlyList <IValueProviderFactory> valueProviderFactories,
            ActionContext actionContext,
            CompiledPageActionDescriptor actionDescriptor,
            TempDataPropertyProvider tempDataPropertyProvider)
        {
            _diagnosticSource         = diagnosticSource;
            _logger                   = logger;
            _factory                  = factory;
            _modelFactory             = modelFactory;
            _selector                 = selector;
            _metadataProvider         = metadataProvider;
            _tempDataFactory          = tempDataFactory;
            _viewOptions              = viewOptions.Value;
            _filters                  = filters;
            _valueProviderFactories   = new CopyOnWriteList <IValueProviderFactory>(valueProviderFactories);
            _actionContext            = actionContext;
            _actionDescriptor         = actionDescriptor;
            _tempDataPropertyProvider = tempDataPropertyProvider;

            _cursor = new FilterCursor(_filters);
        }
 public PageActionInvokerProvider(
     PageLoader pageLoader,
     PageActionInvokerCache pageActionInvokerCache,
     IModelMetadataProvider modelMetadataProvider,
     ITempDataDictionaryFactory tempDataFactory,
     IOptions <MvcOptions> mvcOptions,
     IOptions <MvcViewOptions> mvcViewOptions,
     IPageHandlerMethodSelector selector,
     DiagnosticListener diagnosticListener,
     ILoggerFactory loggerFactory,
     IActionResultTypeMapper mapper,
     IActionContextAccessor?actionContextAccessor = null)
 {
     _pageLoader             = pageLoader;
     _pageActionInvokerCache = pageActionInvokerCache;
     _valueProviderFactories = mvcOptions.Value.ValueProviderFactories.ToArray();
     _modelMetadataProvider  = modelMetadataProvider;
     _tempDataFactory        = tempDataFactory;
     _mvcViewOptions         = mvcViewOptions.Value;
     _selector              = selector;
     _diagnosticListener    = diagnosticListener;
     _logger                = loggerFactory.CreateLogger <PageActionInvoker>();
     _mapper                = mapper;
     _actionContextAccessor = actionContextAccessor ?? ActionContextAccessor.Null;
 }
 public RazorViewRenderService(IActionContextAccessor actionContextAccessor, IHttpContextAccessor httpContextAccessor, ICompositeViewEngine viewEngine, IServiceProvider serviceProvider, IOptions <MvcViewOptions> viewOptions)
 {
     _actionContextAccessor = actionContextAccessor ?? throw new ArgumentNullException(nameof(actionContextAccessor));
     _httpContextAccessor   = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
     _viewEngine            = viewEngine ?? throw new ArgumentNullException(nameof(viewEngine));
     _serviceProvider       = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
     _viewOptions           = viewOptions?.Value ?? throw new ArgumentNullException(nameof(viewOptions));
 }
                public void DefaultValue_ConfiguresOptions()
                {
                    var configure = new MvcServiceOptions();
                    var options   = new MvcViewOptions();

                    configure.Views(options);

                    Assert.False(options.HtmlHelperOptions.ClientValidationEnabled);
                }
Exemplo n.º 6
0
    public static IHtmlGenerator GetHtmlGenerator(IModelMetadataProvider provider)
    {
        var options          = new MvcViewOptions();
        var urlHelperFactory = new Mock <IUrlHelperFactory>();

        urlHelperFactory
        .Setup(f => f.GetUrlHelper(It.IsAny <ActionContext>()))
        .Returns(Mock.Of <IUrlHelper>());

        return(GetHtmlGenerator(provider, urlHelperFactory.Object, options));
    }
Exemplo n.º 7
0
 public ViewRenderService(
     IModelMetadataProvider modelMetadataProvider,
     ICompositeViewEngine viewEngine,
     IHttpContextAccessor httpContextAccessor,
     ITempDataProvider tempDataProvider,
     IServiceProvider serviceProvider,
     IOptions <MvcViewOptions> viewOptions)
 {
     _modelMetadataProvider = modelMetadataProvider;
     _viewEngine            = viewEngine;
     _httpContextAccessor   = httpContextAccessor;
     _tempDataProvider      = tempDataProvider;
     _serviceProvider       = serviceProvider;
     ViewOptions            = viewOptions.Value;
 }
        private static ValidationHtmlAttributeProvider GetAttributeProvider(IModelMetadataProvider metadataProvider)
        {
            // Add validation properties for float, double and decimal properties. Ignore everything else.
            var mvcViewOptions = new MvcViewOptions();

            mvcViewOptions.ClientModelValidatorProviders.Add(new NumericClientModelValidatorProvider());

            var mvcViewOptionsAccessor = new Mock <IOptions <MvcViewOptions> >();

            mvcViewOptionsAccessor.SetupGet(accessor => accessor.Value).Returns(mvcViewOptions);

            return(new DefaultValidationHtmlAttributeProvider(
                       mvcViewOptionsAccessor.Object,
                       metadataProvider,
                       new ClientValidatorCache()));
        }
        public async Task RenderPartialViewToString_should_successfully_render_view_into_string()
        {
            // Arrange.

            string data            = "this is the data";
            string partialViewPath = "temp/view/myview";

            // Http context
            Mock <HttpContext>        mockContext        = new Mock <HttpContext>();
            Mock <IFeatureCollection> mockFeaturesColl   = new Mock <IFeatureCollection>();
            Mock <IRoutingFeature>    mockRoutingFeature = new Mock <IRoutingFeature>();
            Mock <RouteData>          mockRoutData       = new Mock <RouteData>();

            mockRoutingFeature.Setup(m => m.RouteData).Returns(mockRoutData.Object);
            mockFeaturesColl.Setup(m => m.Get <IRoutingFeature>()).Returns(mockRoutingFeature.Object);
            mockContext.Setup(m => m.Features).Returns(mockFeaturesColl.Object);
            mockHttpContextAccessor.Setup(m => m.HttpContext).Returns(mockContext.Object);

            // Razor view engine mocks
            Mock <IViewEngine> mockEngine = new Mock <IViewEngine>();
            Mock <IView>       mockView   = new Mock <IView>();

            mockRazorViewEngine.Setup(m => m.FindView(It.IsAny <ActionContext>(), It.IsAny <string>(), It.IsAny <bool>())).Returns(ViewEngineResult.Found(partialViewPath, mockView.Object));
            IViewRenderer renderer = new ViewRenderer(mockViewOptions.Object, mockRazorViewEngine.Object, mockTempDataProvider.Object, mockHttpContextAccessor.Object);

            // IOptions

            Mock <MvcViewOptions> mockMvcOptions = new Mock <MvcViewOptions>();
            MvcViewOptions        opt            = new MvcViewOptions();

            opt.HtmlHelperOptions = new HtmlHelperOptions();
            //mockMvcOptions.Setup(m => m.HtmlHelperOptions).Returns(new HtmlHelperOptions());
            mockViewOptions.Setup(m => m.Value).Returns(opt);

            // Act.

            string htmlString = await renderer.RenderPartialViewToString(data, partialViewPath);

            // Assert.

            // since we are not passing in any view ... the result html string should be empty.
            Assert.IsEmpty(htmlString);
        }
 public PageActionInvokerProvider(
     PageLoader loader,
     IPageFactoryProvider pageFactoryProvider,
     IPageModelFactoryProvider modelFactoryProvider,
     IRazorPageFactoryProvider razorPageFactoryProvider,
     IActionDescriptorCollectionProvider collectionProvider,
     IEnumerable <IFilterProvider> filterProviders,
     ParameterBinder parameterBinder,
     IModelMetadataProvider modelMetadataProvider,
     IModelBinderFactory modelBinderFactory,
     ITempDataDictionaryFactory tempDataFactory,
     IOptions <MvcOptions> mvcOptions,
     IOptions <MvcViewOptions> mvcViewOptions,
     IPageHandlerMethodSelector selector,
     DiagnosticListener diagnosticListener,
     ILoggerFactory loggerFactory,
     IActionResultTypeMapper mapper,
     IActionContextAccessor actionContextAccessor)
 {
     _loader = loader;
     _pageFactoryProvider      = pageFactoryProvider;
     _modelFactoryProvider     = modelFactoryProvider;
     _modelBinderFactory       = modelBinderFactory;
     _razorPageFactoryProvider = razorPageFactoryProvider;
     _collectionProvider       = collectionProvider;
     _filterProviders          = filterProviders.ToArray();
     _valueProviderFactories   = mvcOptions.Value.ValueProviderFactories.ToArray();
     _parameterBinder          = parameterBinder;
     _modelMetadataProvider    = modelMetadataProvider;
     _tempDataFactory          = tempDataFactory;
     _mvcOptions            = mvcOptions.Value;
     _mvcViewOptions        = mvcViewOptions.Value;
     _selector              = selector;
     _diagnosticListener    = diagnosticListener;
     _logger                = loggerFactory.CreateLogger <PageActionInvoker>();
     _mapper                = mapper;
     _actionContextAccessor = actionContextAccessor ?? ActionContextAccessor.Null;
 }
Exemplo n.º 11
0
 public AbpIdNameTagHelper(IOptions <MvcViewOptions> mvcViewOptions)
 {
     _mvcViewOptions = mvcViewOptions.Value;
 }
Exemplo n.º 12
0
        public static IReadOnlyList <LifecycleProperty> GetTempDataProperties(Type type, MvcViewOptions viewOptions)
        {
            List <LifecycleProperty> results = null;

            var propertyHelpers = PropertyHelper.GetVisibleProperties(type: type);
            var prefix          = viewOptions.SuppressTempDataAttributePrefix ?
                                  string.Empty :
                                  "TempDataProperty-";

            for (var i = 0; i < propertyHelpers.Length; i++)
            {
                var propertyHelper    = propertyHelpers[i];
                var property          = propertyHelper.Property;
                var tempDataAttribute = property.GetCustomAttribute <TempDataAttribute>();
                if (tempDataAttribute != null)
                {
                    ValidateProperty(propertyHelper.Property);
                    if (results == null)
                    {
                        results = new List <LifecycleProperty>();
                    }

                    var key = tempDataAttribute.Key;
                    if (string.IsNullOrEmpty(key))
                    {
                        key = prefix + property.Name;
                    }

                    results.Add(new LifecycleProperty(property, key));
                }
            }

            return(results);
        }
Exemplo n.º 13
0
        private static HtmlHelper <TModel> GetHtmlHelper <TModel>(
            ViewDataDictionary <TModel> viewData,
            IUrlHelper urlHelper,
            ICompositeViewEngine viewEngine,
            IModelMetadataProvider provider,
            Func <IHtmlHelper, IHtmlHelper> innerHelperWrapper,
            IHtmlGenerator htmlGenerator,
            string idAttributeDotReplacement)
        {
            var httpContext   = new DefaultHttpContext();
            var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());

            var options = new MvcViewOptions();

            if (!string.IsNullOrEmpty(idAttributeDotReplacement))
            {
                options.HtmlHelperOptions.IdAttributeDotReplacement = idAttributeDotReplacement;
            }
            var localizationOptionsAccesor = new Mock <IOptions <MvcDataAnnotationsLocalizationOptions> >();

            localizationOptionsAccesor.SetupGet(o => o.Value).Returns(new MvcDataAnnotationsLocalizationOptions());

            options.ClientModelValidatorProviders.Add(new DataAnnotationsClientModelValidatorProvider(
                                                          new ValidationAttributeAdapterProvider(),
                                                          localizationOptionsAccesor.Object,
                                                          stringLocalizerFactory: null));
            var optionsAccessor = new Mock <IOptions <MvcViewOptions> >();

            optionsAccessor
            .SetupGet(o => o.Value)
            .Returns(options);

            var urlHelperFactory = new Mock <IUrlHelperFactory>();

            urlHelperFactory
            .Setup(f => f.GetUrlHelper(It.IsAny <ActionContext>()))
            .Returns(urlHelper);

            var expressionTextCache = new ExpressionTextCache();

            if (htmlGenerator == null)
            {
                var attributeProvider = new DefaultValidationHtmlAttributeProvider(
                    optionsAccessor.Object,
                    provider,
                    new ClientValidatorCache());
                htmlGenerator = new DefaultHtmlGenerator(
                    Mock.Of <IAntiforgery>(),
                    optionsAccessor.Object,
                    provider,
                    urlHelperFactory.Object,
                    new HtmlTestEncoder(),
                    attributeProvider);
            }

            // TemplateRenderer will Contextualize this transient service.
            var innerHelper = (IHtmlHelper) new HtmlHelper(
                htmlGenerator,
                viewEngine,
                provider,
                new TestViewBufferScope(),
                new HtmlTestEncoder(),
                UrlEncoder.Default);

            if (innerHelperWrapper != null)
            {
                innerHelper = innerHelperWrapper(innerHelper);
            }

            var serviceProvider = new ServiceCollection()
                                  .AddSingleton(viewEngine)
                                  .AddSingleton(urlHelperFactory.Object)
                                  .AddSingleton(Mock.Of <IViewComponentHelper>())
                                  .AddSingleton(innerHelper)
                                  .AddSingleton <IViewBufferScope, TestViewBufferScope>()
                                  .BuildServiceProvider();

            httpContext.RequestServices = serviceProvider;

            var htmlHelper = new HtmlHelper <TModel>(
                htmlGenerator,
                viewEngine,
                provider,
                new TestViewBufferScope(),
                new HtmlTestEncoder(),
                UrlEncoder.Default,
                expressionTextCache);

            var viewContext = new ViewContext(
                actionContext,
                Mock.Of <IView>(),
                viewData,
                new TempDataDictionary(
                    httpContext,
                    Mock.Of <ITempDataProvider>()),
                new StringWriter(),
                options.HtmlHelperOptions);

            htmlHelper.Contextualize(viewContext);

            return(htmlHelper);
        }
        private static HtmlHelper <TModel> GetHtmlHelper <TModel>(
            ViewDataDictionary <TModel> viewData,
            IUrlHelper urlHelper,
            ICompositeViewEngine viewEngine,
            IModelMetadataProvider provider,
            Func <IHtmlHelper, IHtmlHelper> innerHelperWrapper,
            IHtmlGenerator htmlGenerator,
            string idAttributeDotReplacement)
        {
            var httpContext   = new DefaultHttpContext();
            var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor(), viewData.ModelState);

            var options = new MvcViewOptions();

            if (!string.IsNullOrEmpty(idAttributeDotReplacement))
            {
                options.HtmlHelperOptions.IdAttributeDotReplacement = idAttributeDotReplacement;
            }
            var localizationOptionsAccesor = new Mock <IOptions <MvcDataAnnotationsLocalizationOptions> >();

            localizationOptionsAccesor.SetupGet(o => o.Value).Returns(new MvcDataAnnotationsLocalizationOptions());

            options.ClientModelValidatorProviders.Add(new DataAnnotationsClientModelValidatorProvider(
                                                          new ValidationAttributeAdapterProvider(),
                                                          localizationOptionsAccesor.Object,
                                                          stringLocalizerFactory: null));
            var optionsAccessor = new Mock <IOptions <MvcViewOptions> >();

            optionsAccessor
            .SetupGet(o => o.Value)
            .Returns(options);

            var valiatorProviders = new[]
            {
                new DataAnnotationsModelValidatorProvider(
                    new ValidationAttributeAdapterProvider(),
                    new TestOptionsManager <MvcDataAnnotationsLocalizationOptions>(),
                    stringLocalizerFactory: null),
            };

            var validator = new DefaultObjectValidator(provider, valiatorProviders);

            validator.Validate(actionContext, validationState: null, prefix: string.Empty, viewData.Model);

            var urlHelperFactory = new Mock <IUrlHelperFactory>();

            urlHelperFactory
            .Setup(f => f.GetUrlHelper(It.IsAny <ActionContext>()))
            .Returns(urlHelper);

            var expressionTextCache = new ExpressionTextCache();

            var attributeProvider = new DefaultValidationHtmlAttributeProvider(
                optionsAccessor.Object,
                provider,
                new ClientValidatorCache());

            if (htmlGenerator == null)
            {
                htmlGenerator = new DefaultHtmlGenerator(
                    Mock.Of <IAntiforgery>(),
                    optionsAccessor.Object,
                    provider,
                    urlHelperFactory.Object,
                    new HtmlTestEncoder(),
                    attributeProvider);
            }

            // TemplateRenderer will Contextualize this transient service.
            var innerHelper = (IHtmlHelper) new HtmlHelper(
                htmlGenerator,
                viewEngine,
                provider,
                new TestViewBufferScope(),
                new HtmlTestEncoder(),
                UrlEncoder.Default);

            if (innerHelperWrapper != null)
            {
                innerHelper = innerHelperWrapper(innerHelper);
            }

            var serviceCollection = new ServiceCollection();

            serviceCollection
            .AddSingleton(viewEngine)
            .AddSingleton(urlHelperFactory.Object)
            .AddSingleton(Mock.Of <IViewComponentHelper>())
            .AddSingleton(innerHelper)
            .AddSingleton <IViewBufferScope, TestViewBufferScope>()
            .AddSingleton <ValidationHtmlAttributeProvider>(attributeProvider)
            .AddHtmlTags(reg =>
            {
                reg.Editors.IfPropertyIs <DateTimeOffset>().ModifyWith(m =>
                                                                       m.CurrentTag.Attr("type", "datetime-local")
                                                                       .Value(GetDateValue(m.Value <DateTimeOffset?>())));
            });

            var serviceProvider = serviceCollection.BuildServiceProvider();

            httpContext.RequestServices = serviceProvider;

            var htmlHelper = new HtmlHelper <TModel>(
                htmlGenerator,
                viewEngine,
                provider,
                new TestViewBufferScope(),
                new HtmlTestEncoder(),
                UrlEncoder.Default,
                expressionTextCache);

            var viewContext = new ViewContext(
                actionContext,
                Mock.Of <IView>(),
                viewData,
                new TempDataDictionary(
                    httpContext,
                    Mock.Of <ITempDataProvider>()),
                new StringWriter(),
                options.HtmlHelperOptions)
            {
                ClientValidationEnabled = true
            };

            htmlHelper.Contextualize(viewContext);

            return(htmlHelper);
        }
Exemplo n.º 15
0
    public static IHtmlGenerator GetHtmlGenerator(IModelMetadataProvider provider, IUrlHelperFactory urlHelperFactory, MvcViewOptions options)
    {
        var optionsAccessor = new Mock <IOptions <MvcViewOptions> >();

        optionsAccessor
        .SetupGet(o => o.Value)
        .Returns(options);

        var attributeProvider = new DefaultValidationHtmlAttributeProvider(
            optionsAccessor.Object,
            provider,
            new ClientValidatorCache());

        var htmlGenerator = new DefaultHtmlGenerator(
            Mock.Of <IAntiforgery>(),
            optionsAccessor.Object,
            provider,
            urlHelperFactory,
            new HtmlTestEncoder(),
            attributeProvider);

        return(htmlGenerator);
    }
 public TempDataFilterPageApplicationModelProvider(IOptions <MvcViewOptions> options)
 {
     _options = options.Value;
 }
 public DisableClientValidationFilter(IOptions <MvcViewOptions> optionsAccessor)
 {
     _options = optionsAccessor.Value;
 }
Exemplo n.º 18
0
    // GetCurrentValues uses only the IModelMetadataProvider passed to the DefaultHtmlGenerator constructor.
    private static IHtmlGenerator GetGenerator(IModelMetadataProvider metadataProvider, MvcViewOptions options = default)
    {
        var mvcViewOptionsAccessor = new Mock <IOptions <MvcViewOptions> >();

        mvcViewOptionsAccessor.SetupGet(accessor => accessor.Value).Returns(options ?? new MvcViewOptions());

        var htmlEncoder = Mock.Of <HtmlEncoder>();
        var antiforgery = new Mock <IAntiforgery>();

        antiforgery
        .Setup(mock => mock.GetAndStoreTokens(It.IsAny <DefaultHttpContext>()))
        .Returns(() =>
        {
            return(new AntiforgeryTokenSet("requestToken", "cookieToken", "formFieldName", "headerName"));
        });

        var attributeProvider = new DefaultValidationHtmlAttributeProvider(
            mvcViewOptionsAccessor.Object,
            metadataProvider,
            new ClientValidatorCache());

        return(new DefaultHtmlGenerator(
                   antiforgery.Object,
                   mvcViewOptionsAccessor.Object,
                   metadataProvider,
                   new UrlHelperFactory(),
                   htmlEncoder,
                   attributeProvider));
    }
Exemplo n.º 19
0
        private static HtmlHelper <TModel> GetHtmlHelper <TModel>(
            ViewDataDictionary <TModel> viewData,
            IUrlHelper urlHelper,
            ICompositeViewEngine viewEngine,
            IModelMetadataProvider provider,
            Func <IHtmlHelper, IHtmlHelper> innerHelperWrapper,
            IHtmlGenerator htmlGenerator,
            string idAttributeDotReplacement)
        {
            var httpContext   = new DefaultHttpContext();
            var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());

            var options = new MvcViewOptions();

            if (!string.IsNullOrEmpty(idAttributeDotReplacement))
            {
                options.HtmlHelperOptions.IdAttributeDotReplacement = idAttributeDotReplacement;
            }
            var localizationOptionsAccesor = new Mock <IOptions <MvcDataAnnotationsLocalizationOptions> >();

            localizationOptionsAccesor.SetupGet(o => o.Value).Returns(new MvcDataAnnotationsLocalizationOptions());

            options.ClientModelValidatorProviders.Add(new DataAnnotationsClientModelValidatorProvider(
                                                          localizationOptionsAccesor.Object,
                                                          stringLocalizerFactory: null));
            var optionsAccessor = new Mock <IOptions <MvcViewOptions> >();

            optionsAccessor
            .SetupGet(o => o.Value)
            .Returns(options);

            var serviceProvider = new Mock <IServiceProvider>();

            serviceProvider
            .Setup(s => s.GetService(typeof(ICompositeViewEngine)))
            .Returns(viewEngine);
            serviceProvider
            .Setup(s => s.GetService(typeof(IUrlHelper)))
            .Returns(urlHelper);
            serviceProvider
            .Setup(s => s.GetService(typeof(IViewComponentHelper)))
            .Returns(new Mock <IViewComponentHelper>().Object);
            serviceProvider
            .Setup(s => s.GetService(typeof(IViewComponentHelper)))
            .Returns(new Mock <IViewComponentHelper>().Object);

            httpContext.RequestServices = serviceProvider.Object;
            if (htmlGenerator == null)
            {
                htmlGenerator = new DefaultHtmlGenerator(
                    Mock.Of <IAntiforgery>(),
                    optionsAccessor.Object,
                    provider,
                    urlHelper,
                    new CommonTestEncoder());
            }

            // TemplateRenderer will Contextualize this transient service.
            var innerHelper = (IHtmlHelper) new HtmlHelper(
                htmlGenerator,
                viewEngine,
                provider,
                new CommonTestEncoder(),
                new UrlEncoder(),
                new JavaScriptStringEncoder());

            if (innerHelperWrapper != null)
            {
                innerHelper = innerHelperWrapper(innerHelper);
            }
            serviceProvider
            .Setup(s => s.GetService(typeof(IHtmlHelper)))
            .Returns(() => innerHelper);

            var htmlHelper = new HtmlHelper <TModel>(
                htmlGenerator,
                viewEngine,
                provider,
                new CommonTestEncoder(),
                new UrlEncoder(),
                new JavaScriptStringEncoder());

            var viewContext = new ViewContext(
                actionContext,
                Mock.Of <IView>(),
                viewData,
                new TempDataDictionary(
                    new HttpContextAccessor(),
                    Mock.Of <ITempDataProvider>()),
                new StringWriter(),
                options.HtmlHelperOptions);

            htmlHelper.Contextualize(viewContext);

            return(htmlHelper);
        }