example of how you could write an integration test for the API's POST method using the Respawn nuget package.
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Testing;
using Respawn;
using Xunit;
namespace MyApi.IntegrationTests
{
public class DrinksControllerTests : IClassFixture<WebApplicationFactory<Startup>>
{
private readonly WebApplicationFactory<Startup> _factory;
private readonly Checkpoint _checkpoint;
public DrinksControllerTests(WebApplicationFactory<Startup> factory)
{
_factory = factory;
_checkpoint = new Checkpoint();
}
[Fact]
public async Task Post_ShouldCreateDrink()
{
// Arrange
var client = _factory.CreateClient();
_checkpoint.Reset("MyDatabase");
var drink = new { Id = 1, Name = "Coke" };
var json = JsonConvert.SerializeObject(drink);
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
// Act
var response = await client.PostAsync("/api/drinks", stringContent);
// Assert
Assert.Equal(HttpStatusCode.Created, response.StatusCode);
// Assert that the drink is created in the database
using (var connection = new SqlConnection("Server=localhost;Database=MyDatabase;User Id=sa;Password=mypassword"))
{
var count = await connection.ExecuteScalarAsync<int>("SELECT COUNT(*) FROM Drinks WHERE Id = @id AND Name = @name", drink);
Assert.Equal(1, count);
}
}
}
}