Я пытаюсь использовать InternalsVisibleTo чтобы я мог протестировать служебный / вспомогательный метод из отдельной тестовой сборки. Когда я пытаюсь вызвать метод internal с параметр динамический Я получаю сообщение об ошибке "Не удалось обработать исключение 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));
}
}