2012-02-21 139 views
5

我試圖在.net中單元測試一個私有函數。這個私有函數返回一個類型爲myClass的集合,這是一個內部類。InternalsVisibleTo似乎被忽略

我已經使用程序集屬性InternalsVisibleTo,因此myClass類型對我的測試項目是已知的。

這是我想測試代碼:

namespace MyProject 
{ 
    public class Class1 
    { 
     private List<myClass> myFunction() 
     { 
      return new List<myClass>(); 
     } 

     internal class myClass 
     { 
      public int MyProperty { get; set; } 
     } 
    } 
} 

[TestMethod()] 
[DeploymentItem("MyProject.dll")] 
public void myFunctionTest() 
{ 
    Class1_Accessor target = new Class1_Accessor(); 
    List<Class1_Accessor.myClass> expected = null; 
    List<Class1_Accessor.myClass> actual; 
    actual = target.myFunction(); 
    Assert.AreEqual(expected, actual); 
    Assert.Inconclusive("Verify the correctness of this test method."); 
} 

,並在我的程序集信息文件:

[assembly: InternalsVisibleTo("MyProject.Test")] 

那麼,爲什麼Visual Studio中的列表的類型設置爲Class1_Accessor.myClass因爲myClass是已知到我的測試項目?

因此,我得到一個運行時錯誤(無法將類型myClass轉換爲類型Class1_Accessor.myClass)。

由於myFunction是私有的,VisualStudio中生成以下代碼(這是適用於大多數的話)

[Shadowing("MyProject.Class1")] 
public class Class1_Accessor : BaseShadow 
{ 
    protected static PrivateType m_privateType; 

    [Shadowing("[email protected]")] 
    public Class1_Accessor(); 
    public Class1_Accessor(PrivateObject value); 

    public static PrivateType ShadowedType { get; } 

    public static Class1_Accessor AttachShadow(object value); 
    [Shadowing("[email protected]")] 
    public List<Class1_Accessor.myClass> myFunction(); 

    [Shadowing("MyProject.Class1+myClass")] 
    public class myClass : BaseShadow 
    { 
     protected static PrivateType m_privateType; 

     [Shadowing("[email protected]")] 
     public myClass(); 
     public myClass(PrivateObject value); 

     [Shadowing("MyProperty")] 
     public int MyProperty { get; set; } 
     public static PrivateType ShadowedType { get; } 

     public static Class1_Accessor.myClass AttachShadow(object value); 
    } 
} 

不過,我不明白爲什麼它包含MyClass的一個新的定義,因爲它是一個內部類,它不應該需要任何訪問器。我認爲這是問題的根源。

+0

您可能想要添加'mstest'標籤來吸引那些使用Accessors的人的注意力。我不確定要刪除哪個標籤,所以我沒有自己編輯標籤。我從來沒有太在意訪問者,所以我沒有什麼經驗。 (此外,有一種強烈的觀點認爲,你不應該測試私人成員;如果你有一個私人成員不是通過公共成員間接測試的,那麼這是一個跡象表明你應該爲該邏輯提取一個單獨的類。) – phoog 2012-02-21 14:46:45

+0

謝謝,我已經添加了標籤。測試私人成員是否是一個完全不同的主題(儘管你是對的)。儘管如此,我仍然想測試一個函數。 – Sam 2012-02-21 14:55:30

+0

關於私人成員的測試,這是一個完全不同的話題是我把它放在括號中的原因。當然,這樣的指導方針總是有明確的例外。我會補充說,當我*測試私人成員時,我通常只使用反射 - 我甚至爲此目的有一些幫助方法(例如'CallNonPublicMethod(string methodName)')。我發現比訪問者更容易處理 - 當我修改它們所映射的類時,我從未想出如何讓它們重新生成。 – phoog 2012-02-21 15:04:17

回答

0

InternalsVisibleTo不會使私人成員對朋友程序集可見。它適用於標記爲內部的成員/類型。檢查文檔here

更新

試試這個(按照本doc):重新生成測試類,在創建單元測試對話框中,單擊設置。在測試生成設置確保榮譽InternalsVisibleTo屬性複選框被選中

+1

請再次閱讀我的問題。類型myClass IS Internal,不是私有的。這只是我想測試的私有方法。 – Sam 2012-02-21 14:31:30

+2

在你的代碼中,myFunction是私人的。 – Fernando 2012-02-21 14:33:53

+0

是的,myFunction是私人的,所以VisualStudio爲它創建一個訪問器是正常的。但是,myClass是Internal(並且在程序集文件中標記爲Friend),所以我不明白爲什麼VisualStudio會爲它創建一個訪問器。 – Sam 2012-02-21 14:51:51

4

不能轉換MyClass類型爲類型Class1_Accessor.myClass

說的一切,我們需要知道:簡單 - 你有兩個不同的定義的myClass。類型的範圍由彙編; [InternalsVisibleTo(...)]使其易於訪問,但除此之外:業務照常。

找到爲什麼/當你拿到一個第二myClass,並之一:

  • 歧義(命名空間限定等)
  • 重命名其中的一個
  • 刪除其中的一個,如果他們的意思是相同的的東西,是不正確複製

這是完全一樣的有:

namespace A { class Foo {} } 
namespace B { class Foo {} } 

這是兩個完全不相關的類,稱爲Foo,並且它們之間的投射將失敗。