2017-08-23 22 views
0

私は新しい.asp.netコアです。私は、ビューを文字列にレンダリングし、evo pdfを使用してビューをレンダリングするコントローラをテストしています。Asp.Net Core 2.0 Xunitテスト

すべては完全に動作しており、私は郵便配達員を使って正常にテストすることもできます。 私のテスト(Xunit)をデバッグするために2017テストエクスプローラを使用すると、私のテストアプリケーションのエラーが発生します。 Searched Locations within the razor engine 私のカミソリビューエンジンがレンダリングするビューを見つけることができないため、このエラーはRenderViewToStringメソッド内で発生します。ビューを検索するために検索されたパスは、期待どおりです。どんな指導も高く評価されます。

//Unit Test Code 
    [Fact] 
    public async void GetPdf() 
    { 
     var response = await _client.PostAsJsonAsync<Common.DTO.Invoice>("/api/values/1", GetDummyData()); 

     using (var file = System.IO.File.Create(@"c:\\Test" + DateTime.Now.ToString("yyyyyMMddHHmmss") + ".pdf")) 
      { 
      //create a new file to write to 
      await response.Content.CopyToAsync(file); 
      await file.FlushAsync(); // flush back to disk before disposing 
      } 


    } 

    //Render view to string service 
    public interface IViewRenderService 
    { 
    Task<string> RenderToStringAsync(string viewName, ViewDataDictionary viewData); 
    } 
    public class ViewRenderService : IViewRenderService 
    { 
    private readonly IRazorViewEngine _razorViewEngine; 
    private readonly ITempDataProvider _tempDataProvider; 
    private readonly IServiceProvider _serviceProvider; 

    public ViewRenderService(IRazorViewEngine razorViewEngine,ITempDataProvider tempDataProvider,IServiceProvider serviceProvider) 
    { 
     _razorViewEngine = razorViewEngine; 
     _tempDataProvider = tempDataProvider; 
     _serviceProvider = serviceProvider; 
    } 

    public async Task<string> RenderToStringAsync(string viewName, ViewDataDictionary viewData) 
    { 
     var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider }; 
     var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); 

     using (var sw = new StringWriter()) 
     { 
      var viewResult = _razorViewEngine.FindView(actionContext, viewName, false); 

      if (viewResult.View == null) 
      { 
       throw new ArgumentNullException($"{viewName} does not match any available view"); 
      } 


      var viewContext = new ViewContext(
       actionContext, 
       viewResult.View, 
       viewData, 
       new TempDataDictionary(actionContext.HttpContext, _tempDataProvider), 
       sw, 
       new HtmlHelperOptions() 
      ); 

      await viewResult.View.RenderAsync(viewContext); 
      return sw.ToString(); 
     } 
    } 

    } 

答えて

0

コア2.0で同じエラーが発生しました。問題はRazorViewEngineが空の場合は期待通りに動作していないということですRouteDataオブジェクト。

私はIHttpContextAccessorを注射し、HttpContextRouteDataを得ました。

Startup.cs:

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddScoped<IViewRenderService, ViewRenderService>(); 
     services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
     services.AddMvc(); 
    } 

RazorToStringHelper.cs:

public interface IViewRenderService 
{ 
    Task<string> RenderToStringAsync(string viewName, object model); 
} 

public class ViewRenderService : IViewRenderService 
{ 
    private readonly IRazorViewEngine _razorViewEngine; 
    private readonly ITempDataProvider _tempDataProvider; 
    private readonly IHttpContextAccessor _httpContextAccessor; 

    public ViewRenderService(
     IRazorViewEngine razorViewEngine, 
     IHttpContextAccessor httpContextAccessor, 
     ITempDataProvider tempDataProvider) 
    { 
     _razorViewEngine = razorViewEngine; 
     _tempDataProvider = tempDataProvider; 
     _httpContextAccessor = httpContextAccessor; 
    } 

    public async Task<string> RenderToStringAsync(string viewName, object model) 
    { 
     var httpContext = _httpContextAccessor.HttpContext; 

     var actionContext = new ActionContext(httpContext, httpContext.GetRouteData(), new ActionDescriptor()); 

     var viewResult = _razorViewEngine.FindView(actionContext, viewName, false); 

     if (viewResult.View == null) 
     { 
      throw new ArgumentNullException($"{viewName} does not match any available view"); 
     } 

     using (var sw = new StringWriter()) 
     { 
      var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary()) 
      { 
       Model = model 
      }; 

      var viewContext = new ViewContext(
       actionContext, 
       viewResult.View, 
       viewDictionary, 
       new TempDataDictionary(actionContext.HttpContext, _tempDataProvider), 
       sw, 
       new HtmlHelperOptions() 
      ); 

      await viewResult.View.RenderAsync(viewContext); 
      return sw.ToString(); 
     } 
    } 

} 
+0

私はこれをしようとする情報をいただき、ありがとうございます。 –

関連する問題