Почему большинство фальшивых фреймворков в .NET (Core) не могут имитировать статические и приватные методы? - PullRequest
2 голосов
/ 22 мая 2019

Мой вопрос касается технической причины для этого ограничения, а не о том, как его исправить.

Почему некоторые фреймворки, такие как Telerik JustMock и Typemock Isolator поддерживает эти функции?и мы не можем иметь их в Moq или FakeItEasy или NSubstitute и т. д.

Являются ли упомянутые элементы ненужными в модульном тестировании?

1 Ответ

4 голосов
/ 22 мая 2019

Это из-за того, как работают эти библиотеки.Когда вы макетируете класс с помощью Moq, NSubstitute или FakeItEasy, они динамически создают класс, который наследует этот класс и переопределяет его методы.Но они должны следовать правилам платформы для переопределения методов:

  • не виртуальные методы не могут быть переопределены, по определению
  • частные методы не доступны для производных классов, поэтому онине может быть переопределено (и на самом деле, C # даже не позволяет им быть виртуальными, поскольку это не имеет смысла)
  • статические методы также не могут быть переопределены, потому что это не сделаетсмысл: полиморфизм основан на типе экземпляра, для которого вы вызываете метод, а статические методы не имеют экземпляра ...

На самом деле, эти библиотеки-насмешки не делают ничего, что вы не могли быне сделали себя вручную, написав поддельные / фиктивные классы;они просто облегчают задачу, освобождая вас от стандартного кода.Вы не можете вручную переопределить статический или не виртуальный метод, и эти библиотеки также не могут сделать это по той же причине.

Я не знаю, как работают JustMock и TypeMock Isolator;Я подозреваю, что они совершают какую-то темную магию с внутренними компонентами CLR или, возможно, динамически переписывают код (это то, что делает Pose : он заменяет вызовы указанных методов вызовами методов замены).

EDIT: См. этот вопрос о том, как работает TypeMock Isolator .Он использует API профилировщика для перехвата вызовов методов.Как я уже сказал, темная магия ^^

...