I'm using aspnetcore 3.0 preview 7 for my web api project. Currently I'm implementing the integration tests. (To make the tests easier first, I commented out the Authorize attribute on the controllers.)
The server responds "404 not found". I'm confused about not having "usemvc" in the startup anymore - should I do something different in setting up the test server now? Or does anybody have an idea what causes the 404? (The MS docs for integration testing with 3.0 are not updated yet). I also tried with preview 8, but same issue.
Test class:
[OneTimeTearDown]
public virtual void Cleanup()
{
_unAuthenticatedServer.Dispose();
}
[OneTimeSetUp]
public virtual void Initialize()
{
_unAuthenticatedServer = CreateServer(null);
}
protected TestServer CreateServer(
string currentDirectory = null)
{
IWebHostBuilder webHostBuilder = WebHost.CreateDefaultBuilder();
webHostBuilder.UseContentRoot(currentDirectory == null
? Directory.GetCurrentDirectory()
: Directory.GetCurrentDirectory() + $"\\{currentDirectory}");
webHostBuilder.UseStartup<TestStartup>();
webHostBuilder.UseEnvironment("Test");
webHostBuilder.ConfigureAppConfiguration((_, config) => config.AddJsonFile("appsettings.Test.json"));
return new TestServer(webHostBuilder);
}
[Test, Order(1)]
public async Task Should_Get_Games_Return_StatusCode_Ok()
{
//Arrange
IList<GameDto> expectedDtos = GameDtoTestData.Games;
//Act
HttpResponseMessage responseMessage = await _unAuthenticatedServer
.CreateClient()
.GetAsync("api/games");
//Assert
responseMessage.StatusCode.Should().Be(HttpStatusCode.OK); // but is: 404 NotFound
var responseString = await responseMessage.Content.ReadAsStringAsync();
IEnumerable<GameDto> result = JsonConvert.DeserializeObject<IEnumerable<GameDto>>(responseString);
result.Should().BeEquivalentTo(expectedDtos);
}
Controller:
[Route("api/[controller]")]
[ApiController]
public class GamesController : ControllerBase
{
private readonly IGameService _gameService;
public GamesController(IGameService gameService)
{
_gameService = gameService;
}
[HttpGet]
public async Task<ActionResult<IEnumerable<GameDto>>> Get()
{
return Ok(await _gameService.GetAsync());
}
}
Installed Nuget packages test project:
<ItemGroup>
<PackageReference Include="FluentAssertions" Version="5.8.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="3.0.0-preview7.19365.7" />
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="3.0.0-preview7.19365.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="2.2.6" />
<PackageReference Include="nunit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.14.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
</ItemGroup>
Installed Nuget packages api project:
<ItemGroup>
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="7.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.AzureADB2C.UI" Version="3.0.0-preview6.19307.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.6">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
What works for me is to register the assembly containing the Startup class as an Mvc Application Part.
In your startup class, add the following code to IServiceProvider ConfigureServices(IServiceCollection services)
:
services
.AddMvc(...)
.AddApplicationPart(typeof(Startup).Assembly)
It may seem a bit odd that you need to register the assembly containing the Startup class as an application part in the Startup class itself; but this approach did work for me.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With