Автофиксация с помощью AutoMoq всегда возвращает один и тот же экземпляр после настройки

#c# #moq #autofixture #automoq

Вопрос:

У меня есть следующий код для настройки некоторого ответа от макетного клиента (некоторые части кода опущены для краткости):

 IFixture fixture = new Fixture().Customize(new AutoMoqCustomization() 
                   { ConfigureMembers = true, GenerateDelegates = true });

CustomNetworkCall<ResponseObject> GetNewResponse()
{
  var response = fixture.Create<ResponseObject>();
  fixture.Customize<ResponseObject>(ro => ro.FromFactory(() =>
  {
    response.DataList.AddRange(fixture.CreateMany<DataObject>(random.Next(3, 10)));
    return response;
  })
  .With(item => item.Id, Guid.NewGuid().ToString())  
  );
  return fixture.Create<CustomNetworkCall<ResponseObject>>();
}

//setup for mock code
clientMock.Setup(client => 
   client.GetResponseAsync(
       It.IsAny<IdDescription>(),
       It.IsAny<DataValidation>(), 
       It.IsAny<DateTime?>(), 
       It.IsAny<CancellationToken>()))
  .Returns(GetNewResponse());
           
 

Я использую метод mocked out, чтобы получить новый экземпляр, но я всегда получаю первый созданный ResponseObject экземпляр с тем же самым Id :

 try
{
    //I always get the same instance!!!
    responseObject = await basicClient.GetResponseAsync(new(){Id = Guid.NewGuid()}); 
}
catch (Exception e)
{
    Logger.LogError(e, e.Message);
}
 

К сожалению, документация по этой теме «совершенно» пуста.

Что я должен изменить, чтобы получать новый экземпляр каждый раз, когда я звоню?

Ответ №1:

 //...
.Returns(GetNewResponse());
 

вернет тот же экземпляр, предоставленный при GetNewResponse() вызове.

Если вам нужен другой экземпляр для каждого вызова, то выполните рефакторинг .Returns для вызова делегата

 //...
.Returns(() => GetNewResponse()); //<-- note the function in .Returns
 

Комментарии:

1. Спасибо, это необходимый шаг.