Как имитировать методы, которые принимают или возвращают интервал

#c# #.net #mocking

#c# #.net #издевательство

Вопрос:

Мы использовали moq, который в значительной степени зависит от деревьев выражений и reflection.emit. Но Span не может находиться в дереве выражений, поэтому методы, которые принимают или возвращают интервал, не могут быть имитированы с его помощью.

Мы работали над этим, вручную создавая макеты, самостоятельно реализуя интерфейсы. Но это отнимает много времени и далеко от идеала.

Как я могу имитировать метод, который принимает или возвращает диапазон?

Комментарии:

1. Используйте Memory<T> вместо Span<T> .

2. @aepot Хотя это допустимый обходной путь, моему коду не нужна память<T>, и кажется неправильным принудительно использовать память<T> в моем дизайне только из-за издевательства.

3. Вы проверили, возможно ли это с помощью нового механизма трюков в предстоящем Moq 5?

4. нехорошо, но вы могли бы создать класс адаптера, реализующий рассматриваемый интерфейс и делегирующий метод с Span<T> параметром или возвращаемым значением новому виртуальному методу, который имеет, например, T[] вместо этого. Затем создайте Mock<Adapter> и имитируйте новый виртуальный метод.

5. Это конец первого квартала 2022 года, и это все еще кажется проблемой. Moq5 еще не выпущен, и мы все еще не можем издеваться Span<T> . Кто-нибудь смог найти обходной путь?