gpt4 book ai didi

c# - 在 ASP.NET MVC6 中设置 View 引擎以在单元测试中使用 AspNet.TestHost.TestServer

转载 作者:行者123 更新时间:2023-11-30 18:23:01 33 4
gpt4 key购买 nike

如何在 ASP.NET MVC 6 中设置 View 引擎以与 TestServer 创建的测试主机一起工作。我已经尝试实现 trick来自 MVC 6 repo :

[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) 并且在内部无法找到 Index.cshtml View 。所有路径以下是单元测试库路径或 dnx 路径:

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

使用 TestServer 设置 View 引擎和环境以从单元测试工作的方法是什么?

最佳答案

您定义不同环境的想法正在朝着正确的方向发展。

我已经通过使用扩展方法看到了一个非常优雅的解决方案:

https://github.com/bartmax/TestServerMvcHelper

它甚至在 NuGet 上,但我无法从那里开始工作。您可以将 MvcTestApplicationEnvironment.csWebHostBuilderExtensions.cs 这两个类合并到您的解决方案中。

然后你可以使用这个来设置测试服务器:

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

关于c# - 在 ASP.NET MVC6 中设置 View 引擎以在单元测试中使用 AspNet.TestHost.TestServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32916771/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com