2013-04-12 45 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 <>相同的功能,驗證它是對象的同一個實例。我相信今天大多數流行的測試框架提供了類似的行爲。

相關問題