我正在尝试使用InternalsVisibleTo来允许我从单独的Test程序集中测试实用程序/帮助程序方法。当我尝试使用internal参数调用dynamic方法时,我收到错误“未处理的RuntimeBinderException ...由于其保护级别而无法访问。”
我相信我正确使用InternalsVisibleTo属性,因为我可以测试其他不使用dynamic参数的内部方法。以下代码说明了仅 TestInternalMethodWithDynamic 测试失败的情况,如下所示。我已经使用实例方法而不是静态方法重复测试,这没有任何区别。
.NET技术是Silverlight 5,我使用Silverlight Unit Test Framework来执行测试。由于项目的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));
}
}
答案 0 :(得分:0)
解决方法:强>
这不是理想的,但是你可以作弊但仍然通过将参数作为dynamic之外的其他内容(例如.NET Integral Types之一)来测试方法的基础逻辑。我不能说我理解动态类型和隐式类型转换足以完全解释发生了什么,但这似乎绕过了访问修饰符检查。至少我不需要公开这个方法。下面的修改后的测试现在通过了。
我认为这是我的方案可接受的解决方法,但在其他情况下可能会有一些与类型转换相关的边缘情况。
[TestClass]
public class UtilityTest
{
[TestMethod]
public void TestInternalMethodWithDynamic() {
int parameter = 10;
Assert.AreEqual(10, Utility.InternalMethodWithDynamic(parameter));
}
}