Moq Setup 可以将 List 对象识别为相同的对象吗?

Can Moq Setup recognize List objects as the same?

我有一个包含 offerIds 的列表,我将其传递给 Moq 设置。我确信在代理方法执行中,我使用相同的列表调用此方法,但它 returns null。我的问题是 Moq 可以识别 ref 对象 f.e。 ListSetup 参数相同?

_userOrderRepositoryMock
                .Setup(x => x.GetOrderIdsByOfferIds(offerIds))
                .ReturnsAsync(new Dictionary<Guid, Guid>() { });

当您像上面那样使用时,Moq 将简单地进行相等比较。 List<T> 是引用类型,所以两个列表永远不会相等,即使它们包含相似的内容。为了让它工作,我建议你需要实际使用 It。所以像:

_userOrderRepositoryMock
                .Setup(x => x.GetOrderIdsByOfferIds(
                    It.Is<List<obj>>(i => i.All(offerIds))
                 ))
                .ReturnsAsync(new Dictionary<Guid, Guid>() { });

即使这样也取决于 offerIds 是什么。如果 offerIds 是一个值类型,那么这将起作用,如果不是,那么您将需要编写一些 LINQ 或 Equality 函数来定义您希望它们如何对这些对象执行相等。

有关此类内容的更多信息,请参阅 What is “Best Practice” For Comparing Two Instances of a Reference Type?