Moq为不同的IEnumerable参数设置返回相同的结果

时间:2013-04-12 09:01:10

标签: c# unit-testing moq

我在moq遇到了一个非常奇怪的行为,我无法理解这是一个错误还是我做错了什么。这是一个例子:

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,所以肯定是不同的列表。但是当使用不同的参数(transactions0和transactions1)调用时,mock会返回portfolioTransactions1两次。我试图弄清楚出了什么问题,但我没有找到任何理由。然后我为每个列表添加了虚拟元素并修复了它,模拟开始按计划返回不同的值。这是Mock的错误还是我没有得到什么?据我所知,列表中的值不应该影响它。

P.S。我不知道它是否重要但方法接受IEnumberable<CustomerDataTransaction>

2 个答案:

答案 0 :(得分:0)

考虑尝试:

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

从内存中我认为Moq使用了引用相等

答案 1 :(得分:0)

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

使用您的测试框架,如果您说Assert.NotEqual并给它两个对象,它使用相等运算符并说一个空列表等于另一个。考虑能够将objectA.Property1与objectA.Property2进行比较。有意义的是,Assert.Equal会查看值,而不是值的实例。

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