Как вы можете имитировать метод, который возвращает интерфейс?

#c# #moq

#c# #moq

Вопрос:

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

         messagingClient.Setup(x =>
             x.CreateMessage(new OrganizationUserDeletedDomainEvent
             {
                 UserType = 1,
                 OrganizationUserId = 1,
                 OrganizationId = 1,
                 DeletedAt = 100000
             })).Returns();
 

Метод имеет такую подпись:

 IMessage<TContent> CreateMessage<TContent>(TContent messageContent)
   where TContent : class, new();
 

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

1. Имитировать тип, который реализует интерфейс, и возвращать его экземпляр?

2. Можете ли вы показать тестируемому субъекту, что этот макет должен быть применен?

Ответ №1:

вы можете создать макет IMessage и использовать этот макет для возврата

 var messageMock = new Mock<IMessage<OrganizationUserDeletedDomainEvent>>();

messagingClient.Setup(x =>
     x.CreateMessage(new OrganizationUserDeletedDomainEvent
     {
         UserType = 1,
         OrganizationUserId = 1,
         OrganizationId = 1,
         DeletedAt = 100000
     })).Returns(messageMock.Object);
 

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

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