У меня есть класс обслуживания, который вводится в мой контроллер с помощью контейнера 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 не разрешается во время теста, и я получаювнутренняя ошибка сервера ... как создать тест контроллера, который, в свою очередь, использует этот класс обслуживания?
Любая помощь будет принята с благодарностью!