2015-10-02 13 views
3

Как настроить механизм просмотра в ASP.NET MVC 6 для работы с тестовым хостом, созданным TestServer. Я пытался реализовать trick от MVC 6 репо:Настройка Посмотреть в ASP.NET MVC6 для работы с AspNet.TestHost.TestServer в модульных тестах

[Fact] 
public async Task CallMvc() 
{ 
    var client = GetTestHttpClient(); 

    //call to HomeController.Index to get Home/Index.cshtml content 
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "/"); 

    var response = await client.SendAsync(request); 
    var content = await response.Content.ReadAsStringAsync(); 
    PAssert.IsTrue(() => content != null); 
} 

private HttpClient GetTestHttpClient(Action<IServiceCollection> configureServices = null) 
{ 
    var applicationServices = CallContextServiceLocator.Locator.ServiceProvider; 
    var applicationEnvironment = applicationServices.GetRequiredService<IApplicationEnvironment>(); 
    var libraryManager = applicationServices.GetRequiredService<ILibraryManager>(); 
    var startupAssembly = typeof(Startup).Assembly; 

    var applicationName = startupAssembly.GetName().Name; 
    var library = libraryManager.GetLibraryInformation(applicationName); 
    var applicationRoot = Path.GetDirectoryName(library.Path); 

    var hostingEnvironment = new HostingEnvironment() 
    { 
     WebRootPath = applicationRoot 
    }; 

    var loggerFactory = new LoggerFactory(); 

    var startup = new Startup(); 

    Action<IServiceCollection> configureServicesAction = services => 
    { 
     services.AddInstance(applicationEnvironment); 
     services.AddInstance<IHostingEnvironment>(hostingEnvironment); 

     // Inject a custom assembly provider. Overrides AddMvc() because that uses TryAdd(). 
     var assemblyProvider = new FixedSetAssemblyProvider(); 
     assemblyProvider.CandidateAssemblies.Add(startupAssembly); 
     services.AddInstance<IAssemblyProvider>(assemblyProvider); 

     startup.ConfigureServices(services); 
    }; 

    Action<IApplicationBuilder> configureApp = _ => startup.Configure(_, hostingEnvironment, loggerFactory); 
    var server = TestServer.Create(configureApp, configureServicesAction); 
    var httpClient = server.CreateClient(); 

    return httpClient; 
} 

класс запуска только самая простая установка для MVC:

public class Startup 
{ 
    // This method gets called by the runtime. Use this method to add services to the container. 
    public void ConfigureServices(IServiceCollection services) 
    { 
     // Add MVC services to the services container. 
     services.AddMvc(); 
    } 

    // Configure is called after ConfigureServices is called. 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    {  
     // Add MVC to the request pipeline. 
     app.UseMvc(routes => 
     { 
      routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"); 
     }); 
    } 
} 

Я получаю Response status code does not indicate success: 500 (Internal Server Error) и внутренне он не сможет найти индекс. cshtml view. Все пути ниже следующие модульные тесты библиотеки пути или DnX пути:

var applicationBasePath = _appEnvironment.ApplicationBasePath; 
var webRootPath = _env.WebRootPath; 
var baseDirectory = AppDomain.CurrentDomain.BaseDirectory; 

Какой способ установки вида двигателя и окружающей среды для работы с UnitTests использованием TestServer?

ответ

0

Ваша идея определения другой среды идет в правильном направлении.

Я видел довольно элегантное решение для этого с помощью методов расширения:

https://github.com/bartmax/TestServerMvcHelper

Это даже на NuGet, но я не могу заставить его работать оттуда. Вы можете включить два класса: MvcTestApplicationEnvironment.cs и WebHostBuilderExtensions.cs в ваше решение.

Затем вы можете настроить TestServer с помощью этого:

var builder = TestServer.CreateBuilder(); 
builder.UseStartup<Startup>() 
    .UseEnvironment("Testing") 
    .UseApplicationPath("YourMvcApplication"); 
var server = new TestServer(builder); 

 Смежные вопросы

  • Нет связанных вопросов^_^