gpt4 book ai didi

c# - 在 asp.net core 中进行集成测试时获取 404 Not Found

转载 作者:太空宇宙 更新时间:2023-11-03 15:13:38 25 4
gpt4 key购买 nike

我在 asp.net core 中进行集成测试时遇到了一个烦人的错误。

响应状态码不表示成功:404(未找到)。

下面是我的代码。

RegistrationControllerTests.cs

public class RegistrationControllerTests : IClassFixture<TestFixture<TestStartup>>
{
private readonly HttpClient _client;

public RegistrationControllerTests(TestFixture<TestStartup> fixture)
{
_client = fixture.Client;
}

[Fact]
public async void InitialiseTest()
{
//Arrange
var testSession = TestStartup.GetDefaultRegistrationModel();

//Act
var response = await _client.GetAsync("/");
//Assert
response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync();
Assert.True(responseString.Contains(testSession.FormId));
}
}

TestStartup.cs

public class TestStartup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton(provider => Configuration);
services.AddTransient<IRegistrationRepository, ServiceUtilities>();
services.AddTransient<IClientServiceConnector, ClientServiceValidation>();
services.AddTransient<IEmailSender, EmailSender>();
}

private IConfiguration Configuration { get; set; }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment enviroment)
{
app.UseStaticFiles();
app.UseFileServer();
ConfigureRestAuthenticationSetting(enviroment);
app.UseMvc(ConfigureRoutes);

//app.Run(async (context) =>
//{
// await context.Response.WriteAsync("Hello World!");
//});
}

private void ConfigureRestAuthenticationSetting(IHostingEnvironment enviroment)
{
var config = new ConfigurationBuilder()
.SetBasePath(Path.Combine(enviroment.ContentRootPath,"wwwroot"))
.AddJsonFile("TestConfig.json");
Configuration = config.Build();
}

private void ConfigureRoutes(Microsoft.AspNetCore.Routing.IRouteBuilder routeBuilder)
{
routeBuilder.MapRoute("Default", "{controller=Registration}/{action=Index}/{formId}");
}

public static RegistrationModel GetDefaultRegistrationModel()
{
return new RegistrationModel
{
FormId = "12345"
};
}
}

TestFixture.cs

public class TestFixture<TStartup> : IDisposable
{
private const string SolutionName = "RegistrationApplication.sln";
private readonly TestServer _server;
public HttpClient Client { get; }

public TestFixture()
:this(Path.Combine("src"))
{

}
protected TestFixture(string solutionRelativeTargetProjectParentDir)
{
var startupAssembly = typeof(TStartup).GetTypeInfo().Assembly;
var contentRoot = GetProjectPath(solutionRelativeTargetProjectParentDir, startupAssembly);

var builder = new WebHostBuilder()
.UseContentRoot(contentRoot)
.ConfigureServices(InitializeServices)
.UseEnvironment("Development")
.UseStartup(typeof(TStartup));


_server = new TestServer(builder);

Client = _server.CreateClient();
Client.BaseAddress = new Uri("https://localhost:44316/Registration");
}

protected virtual void InitializeServices(IServiceCollection services)
{
var startupAssembly = typeof(TStartup).GetTypeInfo().Assembly;
var manager = new ApplicationPartManager();
manager.ApplicationParts.Add(new AssemblyPart(startupAssembly));

manager.FeatureProviders.Add(new ControllerFeatureProvider());
manager.FeatureProviders.Add(new ViewComponentFeatureProvider());
services.AddSingleton(manager);

}
private static string GetProjectPath(string solutionRelativePath, Assembly startupAssembly)
{
var projectName = "RegistrationApplication";
var applicationBasePath = PlatformServices.Default.Application.ApplicationBasePath;
var directoryInfo = new DirectoryInfo(applicationBasePath);
do
{
var solutionFileInfo = new FileInfo(Path.Combine(directoryInfo.FullName, SolutionName));
if (solutionFileInfo.Exists)
{
return Path.GetFullPath(Path.Combine(directoryInfo.FullName, solutionRelativePath, projectName));
}
directoryInfo = directoryInfo.Parent;
}
while (directoryInfo.Parent != null);
throw new NotImplementedException($"Solution root could not be located using application root {applicationBasePath}.");
}

public void Dispose()
{
Client.Dispose();
_server.Dispose();
}
}

最佳答案

问题是您必须在 GIT 中提交 TestConfig.json。这就是它找不到它而抛出 404 错误的原因。提交 TestConfig.json 文件后,一切正常。

下面是使用 TestConfig.json 的代码。

 private void ConfigureRestAuthenticationSetting(IHostingEnvironment enviroment)
{
var config = new ConfigurationBuilder()
.SetBasePath(Path.Combine(enviroment.ContentRootPath,"wwwroot"))
.AddJsonFile("TestConfig.json");
Configuration = config.Build();
}

关于c# - 在 asp.net core 中进行集成测试时获取 404 Not Found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39989146/

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