Как я могу подделать Assembly.LoadFile и Assembly.GetTypes?
Я изо всех сил пытаюсь подделать эти две строки кода:
Assembly asm = Assembly.LoadFile(fileName);
Type[] asmTypes = loggerAssembly.GetTypes();
Когда я печатаю System.Reflection.ShimAssembly
нет такого типа как ShimAssembly
как, например, в случае System.IO.ShimFile
но только StubAssembly
,
Я мог бы реорганизовать код и сделать это с помощью статического вспомогательного метода, такого как LoadAssemblyAndGetTypes
но это, кажется, ненужный обходной путь. Я бы предпочел официальное решение.
Если бы это работало только так:
var shimAsm = System.Reflection.Fakes.ShimAssembly.LoadFile = (fileName) =>
{
return ???
};
var types = shimAsm.GetTypes = () =>
{
return new Type[] { new object() };
};
Почему это работает для System.IO.File
и не для System.Reflection.Assembly
, Это потому что Assembly
такое абстрактный класс?
В моем модульном тесте я хочу проверить, правильно ли загрузчик моей сборки проверяет, содержит ли загруженная сборка типы, реализующие некоторые интерфейсы, чтобы позже я мог создать их экземпляры.
1 ответ
Я думаю, что нашел ответ, и он не выглядит хорошо:
@Patrick Tseng - команда Visual Studio - пишет в Shim mscorlib и системные ограничения:
... у нас действительно есть список типов, которые мы намеренно не позволяем им отбить. Причина в том, что это может вызвать рекурсивный вызов вашего обходного делегата из самой среды CLR. Например, если среда выполнения CLR использует тип в System.Reflection во время выполнения, и вам случается обходить функции этого типа. Вы можете в конечном итоге вызвать ожидаемое поведение, так как поведение во время выполнения будет полностью изменено.
Короче говоря, мы не подкладываем тип значения System.Reflection.System.Runtime., XamlGeneratedNamespace и некоторые другие типы, которые мы считаем важными и не будем их ограничивать.
так что, в конце концов, мне нужно сохранить статический вспомогательный метод.