The following are code examples to test several scenarios.
(check this project to see more testing code examples)
Test a controller
GivenCorrectDate_WhenGetAvailability_ThenAssertCorrectReturnValue
asserts a controller returns200
when everything goes rightGivenWrongDate_WhenGetAvailability_ThenAssert400ReturnValue
assert a controller returns 400 with specific error messageGivenServiceThrowsException_WhenReserveSlot_ThenAssertExceptionCaught
assert method throws an exception, but it is correctly caught
public class SlotsControllerTest
{
// class we're testing
private SlotsController _controller;
private Mock<ISlotsService> _slotsServiceMock;
private Mock<IOptions<CoreConfig>> _iOptConfigMock;
private Mock<CoreConfig> _configMock;
[SetUp]
public void SetUp()
{
_configMock = new Mock<CoreConfig>();
_iOptConfigMock = new Mock<IOptions<CoreConfig>>();
_iOptConfigMock.Setup(iOpt => iOpt.Value).Returns(_configMock);
_slotsServiceMock = new Mock<ISlotsService>();
_controller = new SlotsController(_slotsServiceMock.Object, _iOptConfigMock.Object);
}
[Test]
public async Task GivenWrongDate_WhenGetAvailability_ThenAssert400ReturnValue()
{
// given
string date = "";
string errorMessage = "oh no! something went wrong!";
var errorMessages = new ErrorMessages
{
GeneralErrorMessage = errorMessage
};
_configMock.Setup(conf => conf.GeneralErrorMessage).Returns(errorMessage);
// when
var result = await _controller.GetAvailability(date) as BadRequestObjectResult;
// then
result.Should().NotBeNull();
result.StatusCode.Should().Be(400);
result.Value.ToString().Should().Contain(errorMessage);
}
[Test]
public async Task GivenCorrectDate_WhenGetAvailability_ThenAssertCorrectReturnValue()
{
// given
string date = "20241012";
var parsedDate = new DateOnly(2024, 10, 12);
string dateFormat = "yyyyMMdd";
_configMock.Setup(conf => conf.InputDateFormat).Returns(dateFormat);
var dto = new WeekAvailabilityResponse();
_slotsServiceMock.Setup(service => service.GetWeekSlotsAsync(parsedDate)).ReturnsAsync(dto);
// when
var result = await _controller.GetAvailability(date) as OkObjectResult;
// then
result.Should().NotBeNull();
result.StatusCode.Should().Be(200);
result.Value.Should().Be(dto);
}
[Test]
public async Task GivenServiceThrowsException_WhenReserveSlot_ThenAssertExceptionCaught()
{
// given
var request = new ReserveSlotRequest();
string errorMessage = "error when throw exception";
var errorMessages = new ErrorMessages
{
GeneralErrorMessage = errorMessage
};
_configMock.Setup(conf => conf.GeneralErrorMessage).Returns(errorMessage);
_slotsServiceMock.Setup(service => service.ReserveSlotsAsync(parsedDate)).ThrowAsync(new HttpRequestException(errorMessage));
// when
var result = await _controller.ReserveSlot(request) as BadRequestObjectResult
// then
result.Should().NotBeNull();
result.StatusCode.Should().Be(400);
result.Value.ToString().Should().Contain(errorMessage);
}
General tests
This is a test to check an exception is thrown for a non-async method.
The method .WithMessage("*null payload*")
works as a like. Any string that contains null payload
will trigger as true.
[Test]
public async Task GivenNullPayload_WhenSetupPost_ThenAssertExceptionIsThrown
{
// given
string url = "http://somethingsomething.com"
string nullPayload = null;
// when
Action result = () => _service.SetUpPost(url, nullPayload);
// then
result.Should().Throw<ArgumentNullException>().WithMessage("*null payload*");
}
This is the example for an async method.
[Test]
public async Task GivenNullPayload_WhenSetupPostAsync_ThenAssertExceptionIsThrown
{
// given
string url = "http://somethingsomething.com";
string nullPayload = null;
// when
Func<Task> result = () => _service.SetUpPostAsync(url, nullPayload);
// then
await result.Should().ThrowAsync<InvalidOperationException>().WithMessage("*null payload*");
}