我試圖在.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的一個新的定義,因爲它是一個內部類,它不應該需要任何訪問器。我認爲這是問題的根源。
您可能想要添加'mstest'標籤來吸引那些使用Accessors的人的注意力。我不確定要刪除哪個標籤,所以我沒有自己編輯標籤。我從來沒有太在意訪問者,所以我沒有什麼經驗。 (此外,有一種強烈的觀點認爲,你不應該測試私人成員;如果你有一個私人成員不是通過公共成員間接測試的,那麼這是一個跡象表明你應該爲該邏輯提取一個單獨的類。) – phoog 2012-02-21 14:46:45
謝謝,我已經添加了標籤。測試私人成員是否是一個完全不同的主題(儘管你是對的)。儘管如此,我仍然想測試一個函數。 – Sam 2012-02-21 14:55:30
關於私人成員的測試,這是一個完全不同的話題是我把它放在括號中的原因。當然,這樣的指導方針總是有明確的例外。我會補充說,當我*測試私人成員時,我通常只使用反射 - 我甚至爲此目的有一些幫助方法(例如'CallNonPublicMethod(string methodName)')。我發現比訪問者更容易處理 - 當我修改它們所映射的類時,我從未想出如何讓它們重新生成。 – phoog 2012-02-21 15:04:17