对于不同的IEnumerable参数设置,Moq返回相同的结果

本文关键字:返回 Moq 结果 设置 于不同 IEnumerable 参数 | 更新日期: 2023-09-27 18:08:53

我在moq中遇到了一个非常奇怪的行为,我不明白这是一个bug还是我做错了什么。下面是示例:

List<CustomerDataTransaction> transactions0 = GetTransactionsSomehow();
List<CustomerDataTransaction> transactions1 = GetTransactionsSomehow();
var portfolioTransactions0 = new List<IPortfolioTransaction>();
var portfolioTransactions1 = new List<IPortfolioTransaction>();
m_TransactionMapperMock
    .Setup(m => m.CreatePortfolioTransactions(transactions0))
    .Returns(portfolioTransactions0);
m_TransactionMapperMock
    .Setup(m => m.CreatePortfolioTransactions(transactions1))
    .Returns(portfolioTransactions1);

我检查了transaction0不等于transactions1,所以它肯定是不同的列表。但是,当使用不同的参数(transaction0和transactions1)调用时,模拟返回两次portfolioTransactions1。我试图找出问题所在,但没有找到任何原因。然后我将虚拟元素添加到每个列表中,这已经修复了它,mock开始按照计划返回不同的值。这是莫克的毛病,还是我没明白?据我所知,列表中的值根本不应该影响它。

注:我不知道这是否重要但是这个方法接受IEnumerable<CustomerDataTransaction>

对于不同的IEnumerable参数设置,Moq返回相同的结果

考虑试试:

It.Is<IEnumerable<CustomerDataTransaction>>(t => t == transactions1))

从记忆中,我认为Moq使用引用相等

扩展NinjaNye的答案,使用It。它满足测试是因为它确保您正在查看对象的确切实例,而不是相等操作符。

在测试框架中,如果你说Assert。NotEqual并给它两个对象,它使用相等操作符并说一个空列表等于另一个。考虑一下能够比较objectA。Property1到objectA.Property2。Assert是有意义的。Equal将查看值,而不是值的实例。

Xunit提供了一个Assert方法。Same,它将提供与Moq的it . is<>相同的功能,验证它是对象的相同实例。我相信今天大多数流行的测试框架都提供了类似的行为。