В контексте Microsoft .Net Framework мне действительно любопытно, как на самом деле имитируют фреймворки (Rhino Mocks, Moq, NMock, и т. Д. ) создать фиктивные объекты из заданного типа.
Меня интересует либо конкретная механика одного метода, либо, если они используют разные методы, возможно, какой-то обзор различных способов. В качестве альтернативы, если бы кто-нибудь мог указать мне на некоторые статьи, это было бы тоже здорово.
Существуют различные техники насмешек.
Некоторые фиктивные библиотеки, такие как Moq и RhinoMocks, используют прокси-серверы Castle Dynamic. По сути, они используют отражение и генерацию кода во время выполнения (CodeDom) для динамического создания классов, которые либо реализуют имитируемый интерфейс, либо являются производными от незапечатанного класса, который имитируется.
TypeMock немного отличается — он использует API Profiler для перехвата и перенаправления вызовов к любому методу любого типа. Это делает его способным имитировать запечатанные типы, системные классы и даже перехватывать и перенаправлять вызовы невиртуальных методов конкретных типов.
ОБНОВЛЕНИЕ: с веб-сайта TypeMock :
Typemock Isolator использует Aspect- Ориентированный дизайн программирования, который создает фиктивный аспект. Внутренне это использует API-интерфейс профилировщика .NET Framework для наблюдения за выполнением приложения. При вызове метода CLR уведомляет Typemock Isolator. То Затем фреймворк может вернуться издевательски значения и переопределить исходный код полностью.