Периодически не проходит async unit test
Есть контроллер
[ApiController]
[Route("[controller]")]
public class MyController : ControllerBase
{
readonly IInterface MyInterface;
readonly IHttpClientFactory ClientFactory;
public MyController(IInterface myInterface, IHttpClientFactory clientFactory)
=> (MyInterface, ClientFactory) = (myInterface, clientFactory);
[HttpPost("/PostData")]
public async Task PostData(MyObject object)
{
var message = MyInterface.Convert(object);
using var client = ClientFactory.CreateClient();
_ = await client.PostAsync(new Uri(message.Link),
new StringContent(message.Content, Encoding.UTF8, "application/json"));
}
}
хочу проверить что вызвался MyInterface.Convert(), и ClientFactory.CreateClient();
есть два теста и SetUp
[TestFixture]
class MyControllerTests
{
HttpClient Client;
Mock<IHttpClientFactory> MockHttpClientFactory;
Mock<IInterface> MockMyInterface;
[SetUp]
public void SetUp()
{
var factory = new WebApplicationFactory<Startup>();
MockMyInterface = new Mock<IInterface>();
MockHttpClientFactory = new Mock<IHttpClientFactory>();
var handlerMock = new Mock<HttpMessageHandler>();
handlerMock.Protected().Setup<Task<HttpResponseMessage>>("SendAsync",
ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(new HttpResponseMessage() { StatusCode = HttpStatusCode.OK }).Verifiable();
MockHttpClientFactory.Setup(c => c.CreateClient(It.IsAny<string>())).Returns(new HttpClient(handlerMock.Object));
MockMyInterface.Setup(c => c.Convert(It.IsAny<MyObject>())).Returns(new MessageAnswerDTO() { Link = "http://localhost/Post", Content = "content" });
Client = factory.WithWebHostBuilder(builder =>
{
builder.ConfigureTestServices(services =>
{
var myInterfaceDescriptor = services.SingleOrDefault(c => c.ServiceType == typeof(IInterface));
var httpClientFactory = services.SingleOrDefault(c => c.ServiceType == typeof(IHttpClientFactory));
services.Remove(myInterfaceDescriptor);
services.Remove(httpClientFactory);
services.AddScoped(c => MockMyInterface.Object);
services.AddSingleton(c => MockHttpClientFactory.Object);
});
}).CreateClient();
}
[Test]
public async Task Configuration_CreateClient_Test()
{
var message = new MyObject() { Id1 = 1, Id2 = 2 };
var content = JsonConvert.SerializeObject(message);
var result = await Client.PostAsync(new Uri("http://localhost/PostData"),
new StringContent(content, Encoding.UTF8, "application/json"));
MockHttpClientFactory.Verify(c => c.CreateClient(It.IsAny<string>()));
}
[Test]
public async Task Configuration_Convert_Test()
{
var message = new MyObject() { Id1 = 1, Id2 = 2 };
var content = JsonConvert.SerializeObject(message);
var result = await Client.PostAsync(new Uri("http://localhost/PostData"),
new StringContent(content, Encoding.UTF8, "application/json"));
MockMyInterface.Verify(c => c.Convert(It.IsAny<MyObject>()));
}
}
Тест Configuration_Convert_Test не проходит никогда, хотя когда прохожу по шагам он точно вызывается и возвращает то что я ему засетапил. Тест Configuration_CreateClient_Test то проходит то валится случайным образом по причине того что проверяемый метод не был вызван. Запускал подряд много раз закономерности не заметил. Подскажите где и что я делаю не так.