2017-05-31 66 views
0

請參閱下面的代碼:SetupGet與多個回調

mockBusinessLayer.Setup(m => m.Calculate(It.IsAny<integer>(), It.IsAny<integer>())).Callback 
      (() => mockBusinessLayer.SetupGet(y => y.FirstNumber).Returns(Helper.FirstNumber)); 
     mockBusinessLayer.Setup(m => m.Calculate(It.IsAny<integer>(), It.IsAny<integer>())).Callback 
      (() => mockBusinessLayer.SetupGet(y => y.SecondNumber).Returns(Helper.SecondNumber)); 

計算()接受兩個整數並將它們相加。如何在同一個模擬對象上設置多個SetupGets?上面的代碼只設置SecondNumber上的Get回調(因爲這是最後一次調用SetupGet)。

更新

這是我試圖測試功能:

public CalculatorDTO Calculate(int NumberOne, int NumberTwo) 
     { 
       _Calculator.Calculate(NumberOne, NumberTwo); 
       return Mapper.Map<CalculatorDTO>(_changeCalculator); 
      } 
     } 

是更好地做到這一點:

mockBusinessLayer.Setup(X => x.FirstNumber) .Returns(Helper.FirstNumber); mockBusinessLayer.Setup(x => x.SecondNumber).Returns(Helper.SecondNumber);

+1

這是設計。 Moq只識別成員上的最後一個設置。你試圖測試什麼? – Nkosi

+0

@Nkosi,是否可以設置多個:SetupGet() – w0051977

+0

顯示您要測試的內容,讓我們看看我們是否有幫助解決您的問題。 – Nkosi

回答

2

你說:

上面的代碼僅設置在SecondNumber的Get回調(因爲它是最後一次SetupGet被調用)。

但是,這並不完全正確:你要的CalculateSetup調用是相同的,因此,第二個將覆蓋第一。就好像第一個Setup從未發生過。

將電話SetupGet撥打Callback是不必要的和令人困惑的。我設置它是這樣的:

mockBusinessLayer.SetupGet(y => y.FirstNumber).Returns(Helper.FirstNumber) 
mockBusinessLayer.SetupGet(y => y.SecondNumber).Returns(Helper.SecondNumber) 
mockBusinessLayer.Setup(m => m.Calculate(It.IsAny<integer>(), It.IsAny<integer>())); 

任何時候FirstNumber被得到,它會返回Helper.FirstNumber,同樣爲SecondNumber返回Helper.SecondNumber


之所以這麼說,如果沒有更多的代碼(什麼類型_Calculator?你是否真的mockBusinessLayer暴露FirstNumber/SecondNumberCalculate?)很難提供更完整的步驟前進。例如,如果您要測試此方法,則不會顯示您需要的方法的設置。


在回答您的更新...

SetupGet提供了一個稍微乾淨API:你是傳遞一個Func需要,而Setup將允許您傳遞一個Action;它返回一個稍微受限制的ISetupGet接口。 SetupGet也有更好的語義,向讀者表明你打算只設置get。

在Moq源代碼中,他們實際上歸結爲相同的代碼,所以要麼完成工作。

+0

謝謝。在Setup上使用SetupGet有什麼好處? (請參閱我的問題中的更新)。 – w0051977

+0

@ w0051977查看更新 –

+0

感謝您的更新。最後,Kenneth K在他的評論中(在我的OP下)說:「在一開始就設置好一切」。這是你在這裏做的或者是否有「更好」的方式?再次感謝。 – w0051977