[英]Unit testing with InternalsVisibleTo does not work for internal methods using dynamic parameters
我試圖使用InternalsVisibleTo允許我從單獨的Test程序集測試實用程序/幫助程序方法。 嘗試使用動態參數調用內部方法時,出現錯誤“ RuntimeBinderException未處理……由於其保護級別而無法訪問。 ”
我相信我可以正確使用InternalsVisibleTo屬性,因為我可以測試不使用動態參數的其他內部方法。 以下代碼說明了只有TestInternalMethodWithDynamic測試失敗的情況,如下所示。 我已經使用實例方法(而不是靜態方法)重復了測試,這沒有什么區別。
.NET技術是Silverlight 5,我正在使用Silverlight單元測試框架來執行測試。 由於項目的Excel自動化要求,我需要使用動態參數。
編輯 :我已經使用.NET 4類庫程序集測試了相同的調用,並且該調用成功完成,因此問題似乎特定於Silverlight 。
實用程序類示例...
public class Utility
{
internal static int InternalMethodWithDynamic(dynamic parameter) {
return (int)parameter;
}
internal static int InternalMethodWithInteger(int parameter) {
return parameter;
}
public static int PublicMethodWithDynamic(dynamic parmater) {
return (int)parmater;
}
public static int PublicMethodWithInteger(int parmater) {
return parmater;
}
}
還有測試班...
[TestClass]
public class UtilityTest
{
[TestMethod]
public void TestInternalMethodWithDynamic() {
dynamic parameter = 10;
Assert.AreEqual(10, Utility.InternalMethodWithDynamic(parameter));
}
[TestMethod]
public void TestPublicMethodWithInteger() {
int parameter = 10;
Assert.AreEqual(10, Utility.PublicMethodWithInteger(parameter));
}
[TestMethod]
public void TestPublicMethodWithDynamic() {
dynamic parameter = 10;
Assert.AreEqual(10, Utility.PublicMethodWithDynamic(parameter));
}
[TestMethod]
public void TestInternalMethodWithInteger() {
int parameter = 10;
Assert.AreEqual(10, Utility.InternalMethodWithInteger(parameter));
}
}
解決方法:
這不是理想的選擇,但是您可以作弊,並且仍然可以通過將參數傳遞為動態以外的參數(例如, .NET整數類型之一 )來測試方法的基本邏輯。 我不能說我對動態類型和隱式類型轉換的理解足夠好,可以確切地解釋正在發生的事情,但這似乎以某種方式繞過了訪問修飾符檢查。 至少我不需要公開該方法。 現在,下面的修改后的測試通過了。
我認為這是我的方案可以接受的解決方法,但在其他情況下可能存在一些與類型轉換相關的極端情況。
[TestClass]
public class UtilityTest
{
[TestMethod]
public void TestInternalMethodWithDynamic() {
int parameter = 10;
Assert.AreEqual(10, Utility.InternalMethodWithDynamic(parameter));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.