2013-04-12 46 views
0

我在moq中遇到了一个非常奇怪的行为,我无法理解它是一个错误还是我做错了什么。这里是这样的例子:Moq对于不同的IEnumberable参数设置返回相同的结果

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)调用时,模拟会返回两次portfolioTransactions1。我试图找出什么是错的,但我没有找到任何理由。然后,我为每个列表添加了虚拟元素,并已修复它,模拟开始按照计划返回不同的值。这是模拟的错误还是我没有得到什么?据我所知,列表中的值不应该影响它。

P.S.我不知道这是否是重要的或没有,但该方法接受IEnumberable<CustomerDataTransaction>

+1

我认为对于moq参数比较器来说,一个空列表等于另一个相同类型的空列表。所以它只在列表中有东西时才起作用。 – nemesv

+0

出于好奇,如果使用It.Is 会发生什么情况。对不起,我不在IDE – NinjaNye

+0

看起来他们对IEnumerable有特殊的处理,而空对象的处理方式是一样的,尽管它看起来更像是一个bug,而不是一个功能。 –

回答

0

考虑尝试:

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

从内存我想用Moq的参考平等

0

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

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

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

相关问题