2012-02-07 58 views
9

我試圖執行後續調用驗證和我發現,起訂量支持InSequence的()方法用於此,如:我可以使用moq的InSequence()和MockBehavior.Loose嗎?

MockSequence s = new MockSequence(); 
validator.InSequence(s).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true); 
encryptor.InSequence(s).Setup(m=>m.Encrypt(It.IsAny<Frame>())); 
socket.InSequence(s).Setup(m => m.Send(It.IsAny<Frame>())); 
compressor.InSequence(s).Setup(m => m.Compress(It.IsAny<Frame>())); 

然而,這似乎是唯一的工作時,我指定仿製品的行爲爲「嚴格」 ,它禁止我在嘲弄的物體上調用額外的方法。但是,我希望能夠調用這些對象的其他方法,我只是希望這些調用按順序執行。

是否有任何「支持」的方式(而不是訴諸於.Callback()和手工實現)?我發現了一個名爲moq.sequence的附加庫,但是,預編譯版本不適用於最新的Moq。

回答

9

好吧,我挖成SVN瀏覽器起訂量的源代碼研究的情況下自己(僅僅是爲了記錄 - 有問題的起訂量的版本是Moq.4.0.10827.Final)。

我的調查使我: http://code.google.com/p/moq/source/browse/trunk/Source/MockSequence.cs?spec=svn751&r=712

通過查看InSequence的()方法,我現在整個執行是基於When()方法見。

所以,在現實中,下面的代碼:

validator.InSequence(s).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true); 

結束了,就像這樣:

validator.When(/* call is made in sequence */).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true); 

換句話說,這只是設置了一個條件行爲 - 當該方法按順序調用指定的Setup()進入遊戲。否則,將執行默認實現。因爲對於嚴格的模擬,默認實現是拋出異常(該調用被視爲未指定),整個解決方案工作。

因此,似乎獲得當前解決方案與鬆散模擬工作將是相當繁瑣。我只會堅持基於Callback()的自制解決方案(順便提一下,它可以很好地包裝),但它無法爲其他方式使用回調功能,但是我並沒有使用它。

我發佈這個答案希望它是有用的。

+0

您是否已將所有這些內容發佈到** Moq's Issues **網站?你必須研究這個問題,所以我認爲它沒有在文檔中解釋 - 所以他們可能沒有意識到這個問題。我可以向你保證,他們會查看那裏發佈的問題/建議。這需要一些時間,但他們需要。我自己發送了一些有用的補丁(嘲笑代表,計數呼叫等)。如果你不想參與,我可以仔細檢查問題並在那裏註冊,但我認爲,因爲你已經知道細節,你會描述它好得多:) [順便說一句。 sorki,niechciałempolskimmieszaćna SO :)] – quetzalcoatl 2012-12-09 11:49:12

+0

嗨,quetzalcoatl。我不知道Moq實際上是維護的,Moq至少有兩個或三個源代碼庫。這是目前的:https://github.com/Moq/moq4? 我會在聖誕節前和新年前的幾天假期,所以也許我會嘗試把東西放在一起或至少進一步調查。 – 2012-12-14 12:06:45

+0

是的,目前的確是GitHub上的。之前Moq是在code.google上託管的,但他們最近搬到了GitHub。 GitHub上看到的問題列表是最近發佈的問題列表,應該在那裏報告新問題。由於報告的「舊」問題和功能請求數量衆多,code.google上的網站仍然存在並未被刪除/刪除/等。他們沒有搬到GitHub,IIRC,因爲沒有辦法導入它們,沒有人真的想複製 - 手工粘貼它們!他們仍然在考慮之中,但我認爲來自GitHub的問題比舊的code.google有優先權。 – quetzalcoatl 2012-12-15 12:11:44

相關問題