1

我有以下代码来设置来自模拟客户端的一些响应(代码的某些部分被省略了):

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());
           

我使用模拟出来的方法来获取一个新实例,但我总是得到第一个创建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);
}

不幸的是,关于这个主题的文档“相当”空。

每次打电话时我应该改变什么来获得一个新的实例?

4

1 回答 1

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

将返回GetNewResponse()调用时提供的相同实例。

如果您希望每次调用都使用不同的实例,请重构.Returns以调用委托

//...
.Returns(() => GetNewResponse()); //<-- note the function in .Returns
于 2021-05-22T17:13:35.430 回答