Description
Describe the bug 🐞
Version 8 introduced a change in #1879 where the IApiResponse<out T>
interface applies the new
keyword on certain properties like StatusCode
and ContentHeaders
.
If you have a method that uses the non-generic IApiResponse
as parameter, the base interface properties will be used which will then not be set. This is especially difficult when mocking these interfaces where we now have to setup both the properties of the generic and non-generic interface.
This is a breaking change which is not mentioned in the release notes of release 8.0.0. This works perfectly in version 7.2.2
Step to reproduce
Have a method that uses the non-generic IApiResponse
:
public static bool IsProblemDetails(this IApiResponse apiResponse)
{
Guard.Against.Null(apiResponse);
var contentType = apiResponse.ContentHeaders?.ContentType?.MediaType;
return
apiResponse.StatusCode == HttpStatusCode.UnprocessableEntity &&
contentType?.Equals(MediaTypeNames.Application.ProblemJson) == true;
}
Create a unit test that mocks the generic IApiResponse<out T>
interface and calls the method:
[Fact]
public void IsProblemDetails_should_return_true_for_unprocessable_entity_with_content_type_problem_details()
{
// Arrange
var headers = new StringContent(string.Empty).Headers;
headers.ContentType = new MediaTypeHeaderValue(MediaTypeNames.Application.ProblemJson);
var mock = new Mock<IApiResponse<string>>();
mock.SetupGet(x => x.IsSuccessStatusCode).Returns(false);
mock.SetupGet(x => x.StatusCode).Returns(HttpStatusCode.UnprocessableEntity);
mock.SetupGet(x => x.ContentHeaders).Returns(headers);
var apiResponse = mock.Object;
// Act
var result = apiResponse.IsProblemDetails();
// Assert
Assert.True(result);
}
This results in null
values for the non-generic interface, making the test fail:
Reproduction repository
No response
Expected behavior
Setting properties on the generic interface should result in being able to use it as the non-generic interface (not breaking inheritance)
Screenshots 🖼️
No response
IDE
No response
Operating system
No response
Version
.NET >6
Device
No response
Refit Version
8.0.0
Additional information ℹ️
No response
Activity