Как имитировать вызовы устойчивых сущностей в устойчивых функциях Azure?

Я использую MOQ для имитации надежного объекта, но вижу эту ошибку:

Методы расширения (здесь: DurableContextExtensions.CallEntityAsync) нельзя использовать в выражениях настройки / проверки.

Вот как я это делаю:

mockContext.Setup(e => e.CallEntityAsync<List<string>>(It.IsAny<EntityId>(), "EntityFunctionName"))
                .ReturnsAsync(new List<string>() {"one", "two", "three" });

Могу ли я имитировать звонки на свою долговечную сущность?


person IronMan    schedule 06.04.2020    source источник


Ответы (1)


Что касается Durable Functions 2.3.0, все наши методы расширения теперь встроены непосредственно в интерфейс, поэтому должно быть значительно проще использовать Moq со всеми этими методами и их перегрузками.

Изменить: предыдущий ответ ниже объясняет, почему предыдущий подход к методу расширения сделал это затруднительным.

Так что это внутреннее ограничение того, как Moq работает с методами расширения.

К сожалению, пока что вам нужно будет узнать основной метод на IDurableOrchestrationContext, который вызывается методом расширения, обеспечивающим используемую вами перегрузку.

Например, в этом случае DurableContextExtension.CallEntityAsync(EntityId entityId, string operationName) вызывает IDurableOrchestrationContext.CallEntityAsync(EntityId entityId, string operationName, object operationInput) со значением null для operationInput. Вы можете найти это, просмотрев исходный код.

Очевидно, что это не идеальный способ имитации, так как, не глядя на наш исходный код, трудно сказать, пытаетесь ли вы имитировать метод расширения во время написания тестов. Вы можете использовать анализатор Moq, чтобы, по крайней мере, отловить эти ошибки во время компиляции, но он все равно выиграл Я не говорю вам, какую сигнатуру метода нужно имитировать, чтобы избавиться от ошибки.

По этой причине мы предлагаем полностью избавиться от методов расширения и просто поместить все эти перегрузки сигнатур как методы интерфейса напрямую, чтобы вы могли безопасно имитировать любой из них. Это критическое изменение для клиентов, которые пишут свои тесты, напрямую внедряя интерфейс, поэтому мы стараемся не включать это изменение в выпуск исправлений и только в второстепенном выпуске с четким руководством по исправлению тех, которые нарушаются этими изменениями. Это будет исправлено в версии 2.3.0 расширения.

person Connor McMahon    schedule 08.04.2020
comment
Привет, я столкнулся с аналогичной проблемой с CallActivityAsync, которая, похоже, не имеет перегрузки. Есть ли обходной путь? - person AgentHunt; 22.06.2020
comment
@AgentHunt, попытка этот метод. Убедитесь, что вы указываете TResult в своем методе установки). - person Connor McMahon; 22.06.2020
comment
Я голосую за ваше предложение перенести методы расширения в интерфейс, опыт тестирования текущего решения очень утомляет меня. - person Henrik Gering; 18.08.2020