1

InternalsVisibleToを使用して、別の Test アセンブリからユーティリティ/ヘルパー メソッドをテストできるようにしようとしています。動的パラメーターを使用して内部メソッドを呼び出そうとすると、 「 RuntimeBinderException was unhandled ... is inaccessible due to its protection level.」というエラーが表示されます。

動的パラメーターを使用しない他の内部メソッドをテストできるので、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));
    }
}
4

1 に答える 1

0

回避策:

これは理想的ではありませんが、パラメーターを動的以外のもの( .NET 整数型の 1 つなど) として渡すことで、少しごまかして、メソッドの基になるロジックをテストすることができます。何が起こっているのかを正確に説明するのに十分なほど動的な型と暗黙的な型の変換を理解しているとは言えませんが、これは何らかの方法でアクセス修飾子のチェックをバイパスしているようです。少なくとも、メソッドを公開する必要はありません。以下の変更されたテストがパスするようになりました。

これは私のシナリオでは許容できる回避策だと思いますが、他の状況での型変換に関連するエッジ ケースがいくつかあるかもしれません。

[TestClass]
public class UtilityTest
{
    [TestMethod]
    public void TestInternalMethodWithDynamic() {
        int parameter = 10;
        Assert.AreEqual(10, Utility.InternalMethodWithDynamic(parameter));
    }
}
于 2013-04-19T06:04:00.290 に答える