1

我正在尝试使用InternalsVisibleTo来允许我从单独的测试程序集中测试实用程序/辅助方法。当我尝试使用动态参数调用内部方法时,我收到错误“ 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));
    }
}
4

1 回答 1

0

解决方法:

这并不理想,但您可以作弊,但仍然可以通过将参数作为动态以外的参数传递(例如.NET Integral Types之一)来测试方法的底层逻辑。我不能说我理解动态类型和隐式类型转换足以解释到底发生了什么,但这似乎以某种方式绕过了访问修饰符检查。至少我不需要公开该方法。下面修改后的测试现在通过了。

我认为这对于我的方案来说是一个可以接受的解决方法,但在其他情况下可能存在与类型转换相关的一些极端情况。

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