IntegrationTestSample
An ASP.NET Core Sample project showcasing how to integration test against Controllers
Posted on September 10, 2019
In this post I'll give you a quick introduction into how you can test your ASP.NET Core Controllers.
Please note that the term "Integration Testing" also covers other cases, such as testing data access or accessing the file system.
A common guideline is to structure your ASP.NET Core projects in the following way:
.
├── src
│ └── MyProject.Api
│ └── Controllers
│ └── ValuesController
└── test
├── IntegrationTests
│ └── MyProject.Api.Test
│ └── ValuesControllerTest
└── UnitTests
Create a .NET Core Test project and then install the Microsoft.AspNetCore.TestHost
package.
This package will provide options to configure the TestServer
.
> Install-Package Microsoft.AspNetCore.TestHost
Create a base class that our ControllerTest
classes can inherit from. We will set up the TestServer
and HttpClient
used to perform requests.
[TestClass]
public abstract class IntegrationTestInitializer
{
protected HttpClient _client;
[TestInitialize]
public void Setup()
{
var builder = new WebHostBuilder()
.UseStartup<Startup>();
var server = new TestServer(builder);
_client = server.CreateClient();
}
}
ControllerTest
Let's pretend the Controller we want to test looks like this
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { "value1", "value2" };
}
}
With the base class set up, we can then simply inherit from the base class and use our _client
to perform requests against the API.
[TestClass]
public class ValuesControllerTest : IntegrationTestInitializer
{
[TestMethod]
public async Task CanGetValues()
{
List<string> expectedResponse = new List<string> { "value1", "value2" };
var responseJson = await _client.GetStringAsync("api/values");
List<string> actualResponse = JsonConvert.DeserializeObject<List<string>>(responseJson);
Assert.AreEqual(expectedResponse.Count, actualResponse.Count);
foreach(var expectedValue in expectedResponse)
{
Assert.IsTrue(actualResponse.Contains(expectedValue));
}
}
}
This post described how you can integration test a very basic ASP.NET Core API.
In the real world you'll probably have a database behind the API that must be accessed and some endpoints may also be protected by an API-Key or JWT.
This post however should only serve as a quick introduction into integration testing.
An ASP.NET Core Sample project showcasing how to integration test against Controllers
Posted on September 10, 2019
Sign up to receive the latest update from our blog.