тестирование интерфейса ICompositeViewEngine - PullRequest
0 голосов
/ 16 января 2019

У меня есть класс обслуживания, который вводится в мой контроллер с помощью контейнера IoC asp net core.Этот класс обслуживания использует ICompositeViewEngine, который разрешает IViewEngine во время запроса.Я использую это для отображения видов бритвы в html-строке.

Это мой класс обслуживания:

{
    public class ViewRenderingService : IViewRenderingService
    {
        private readonly string _assetsRootDir = Path.Combine(Directory.GetCurrentDirectory(), "Views");

        private readonly II18NService _i18NService;
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly IActionContextAccessor _actionContextAccessor;
        private readonly ITempDataProvider _tempDataProvider;
        private readonly IXRayService _xRayService;
        private readonly ICompositeViewEngine _viewEngine;

        public ViewRenderingService(II18NService i18NService, IHttpContextAccessor httpContextAccessor,
            IActionContextAccessor actionContextAccessor, ITempDataProvider tempDataProvider, IXRayService xRayService, ICompositeViewEngine viewEngine)
        {
            _actionContextAccessor = actionContextAccessor;
            _i18NService = i18NService;
            _httpContextAccessor = httpContextAccessor;
            _tempDataProvider = tempDataProvider;
            _xRayService = xRayService;
            _viewEngine = viewEngine;
        }

        public async Task<string> RenderViewAsync(string viewPath, MaintenanceJob maintenanceJob, string culture,
            bool isMainPage = true)
        {
            if (string.IsNullOrEmpty(viewPath))
            {
                return "viewPath is null or empty";
            }

            try
            {
                var model = BuildMaintenanceJobModelTemplate(maintenanceJob, culture);

                using (var writer = new StringWriter())
                {
                    _xRayService.BeginSubsegment("Generating html from view files");
                    IViewEngine viewEngine = _viewEngine;
                        //_httpContextAccessor.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as
                        //    ICompositeViewEngine;
                    ViewEngineResult viewResult = viewEngine.GetView("~/", viewPath, isMainPage);
                    if (viewResult.Success == false)
                    {
                        return $"view with the path {viewPath} could not be found";
                    }

                    var viewData = new ViewDataDictionary<MaintenanceJobTemplateModel>(new EmptyModelMetadataProvider(),
                            new ModelStateDictionary())
                        {Model = model};

                    var tempData = new TempDataDictionary(_httpContextAccessor.HttpContext, _tempDataProvider);

                    ViewContext viewContext = new ViewContext(
                        _actionContextAccessor.ActionContext,
                        viewResult.View,
                        viewData,
                        tempData,
                        writer,
                        new HtmlHelperOptions()
                    );
                    viewContext.ViewBag.AssetFolder = _assetsRootDir.Replace("\\", "/") + "/assets";
                    await viewResult.View.RenderAsync(viewContext);
                    return writer.GetStringBuilder().ToString();
                }
            }
            catch (Exception ex)
            {
                _xRayService.AddExceptionMetadata(ex);
                throw;
            }
            finally
            {
                _xRayService.EndSubsegment("Generating html from view files");
            }
        }

        private MaintenanceJobTemplateModel BuildMaintenanceJobModelTemplate(MaintenanceJob maintenanceJob,
            string culture)
        {
            try
            {
                _i18NService.Culture = culture;

                var jobModel = new MaintenanceJobTemplateModel
                {
                    Job = maintenanceJob,
                    I18N = _i18NService.GetTranslations()
                };
                return jobModel;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
    }
}

Я хочу создать интеграционный тест и попытаться преобразовать примеры видов бритвы в html, используяКласс TestHost, все работает нормально, когда я отлаживаю через swagger / Postman, но когда я пишу интеграционный тест с использованием класса TestServer в asp net core, он, похоже, не работает, поскольку этот класс требует ICompositeViewEngine, ICompositeViewEngine не разрешается во время теста, и я получаювнутренняя ошибка сервера ... как создать тест контроллера, который, в свою очередь, использует этот класс обслуживания?

Любая помощь будет принята с благодарностью!

...