2011-10-25 28 views
0

任何人都知道Moq函數語法是否支持非公共屬性的設置?我注意到它不起作用。使用Moq功能語法設置非公共屬性

注:這是用於功能語法。

public class Foo 
{ 
    public virtual int FooProperty { get; protected set; } 
} 

這不會引發錯誤,但不能嘲笑FooProperty

Mock.Of<Foo>(x => x.FooProperty == 1); 

常規語法工作正常。

var mockFoo = new Mock<Foo>(); mockFoo.SetupGet(x=>x.FooProperty) 
    .Returns(1) 
+0

請顯示您試圖模擬的一些示例代碼,moq設置和您遇到的任何錯誤。 – PatrickSteele

+0

嘲笑內部成員對我來說沒有任何意義。你能否給我一個樣本,所以我明白需要這樣做? – Fischermaen

回答

0

它將支持內部屬性的嘲弄,如果你添加一個組件屬性包含被測類組件(添加到AssemblyInfo.cs中):

// This assembly is the default dynamic assembly generated Castle DynamicProxy, 
// used by Moq. Paste in a single line. 
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 

(你也必須添加InternalsVisibleTo條目,當然。)

如果你這樣做,你可以模擬添加它的程序集中的任何內部屬性。如果你想嘲笑私人或受保護的財產,我敢肯定沒有辦法直接做到這一點。如果它們受到保護,則可以創建一個Dummy繼承者併爲其提供訪問/操作其受保護成員的公共方法或屬性。對於私人而言,我相信沒有什麼可以做的。

1

這可能值得看看微軟研究院的Pex/Moles工具。痣被用來爲非公開的東西創建訪問器。