簡體   English   中英

使用InternalsVisibleTo進行單元測試不適用於使用動態參數的內部方法

[英]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

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM