2010-04-05 105 views
6

Moq允許開發人員嘲笑受保護的成員。我在Rhino.Mocks尋找相同的功能,但未能找到它。如何用Rhino.Mocks模擬受保護的虛擬成員?

這裏是一個例子,從Moq Quick Start頁面如何模擬受保護的方法。

// at the top of the test fixture 
using Moq.Protected() 

// in the test 
var mock = new Mock<CommandBase>(); 
mock.Protected() 
    .Setup<int>("Execute") 
    .Returns(5); 

// if you need argument matching, you MUST use ItExpr rather than It 
// planning on improving this for vNext 
mock.Protected() 
    .Setup<string>("Execute", 
     ItExpr.IsAny<string>()) 
    .Returns(true); 

讓我知道,如果我追逐的東西,不退出。

+0

你可能想看看這個鏈接http://geekswithblogs.net/MattRobertsBlog/archive/2008/12/16/how-to-make-a-quotprotectedquot-method-available-for-quotpartialquot-mocking-and-again.aspx – juharr 2011-03-04 20:11:47

+2

這不是一個真正合適的解決方案 - 不得不改變你的原始類,以在其他類m中內部公開方法你是否正在改變你的設計以迎合測試。難聞的氣味對我來說。 – 2011-11-21 08:34:36

回答

4

我相信這個功能在Rhino Mocks中不存在。

你爲什麼試圖嘲笑受保護的成員?爲什麼不把整個班級作爲一個整體呢?或者,您可以創建測試類的子類並手動創建「模擬」受保護的方法。

+0

我目前正在繼承SUT並模擬受保護的成員。我想知道是否有像Moq這樣的東西能夠讓我從子類化中解脫出來。假設Rhino.Mocks沒有這個功能,我會接受你的答案。 – Vadim 2010-04-08 01:33:56

+0

因爲微軟現在有這樣的事情。 ... 保護內部虛擬OkResult好() { } – 2014-07-03 18:55:54

2

我們創建protected方法爲internal,然後露出內部的單元測試項目和犀牛通過添加以下行到你的AssemblyInfo嘲笑:

[assembly: InternalsVisibleTo("YourNamespace.TestProjectName")] 
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 

作品一種享受我們

+0

keith,謝謝,但我正在尋找一些其他的解決方案,然後修改我的AssemblyInfo。 順便說一句。大約5年前,我創建了一個爲您生成InternalVisibleTo代碼的實用程序。它可能會爲你節省一些時間。你可以在這裏找到它:http://vkreynin.wordpress.com/2007/12/09/testing-internals-members-with-internalsvisibleto-attribute/ – Vadim 2012-09-18 12:20:47

+0

@Vadim很好謝謝你,我相信VS2012允許你模仿任何東西這個問題可能不適用於下一代單元測試! – keith 2012-09-19 03:07:25