#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. Спасибо, это необходимый шаг.