Moq вызывает базовый класс вместо унаследованного класса в функции настройкиC#

Место общения программистов C#
Ответить
Anonymous
 Moq вызывает базовый класс вместо унаследованного класса в функции настройки

Сообщение Anonymous »

Я создаю фоновую службу C# со следующим определением

Код: Выделить всё

public class SqsBackgroundService(
IPollingConfiguration pollingSettings,
IServiceProvider serviceProvider,
IMessagingService messagingService,
IOptions options,
ILogger logger) : RecurringBackgroundService(pollingSettings, serviceProvider)
where TConfig : QueueConfiguration
where TProcessor : IMessageProcessor
{
internal override async Task Execute(IServiceProvider provider, CancellationToken cancellationToken)
{
using (var scope = provider.CreateScope())
{
var messageProcessor = scope.ServiceProvider.GetService();

if (messageProcessor == null)
{
throw new NullReferenceException("Unable to resolve message processor");
}

var result = await messageProcessor.ProcessMessage(message, token);
if (result.ProcessSuccessfully)
....
}
}
}
}
Это используется прослушивателем

Код: Выделить всё

public class ClientEntityListener(
IServiceProvider serviceProvider,
IOptions backgroundConfig,
IOptions queueConfig,
ILogger logger) :
SqsBackgroundService(
backgroundConfig.Value.ClientEntityPollingConfiguration,
serviceProvider,
serviceProvider.GetRequiredService(),
queueConfig,
logger)
{
}

Код: Выделить всё

IClientEntityProcessor
наследует базовый класс IMessageProcessor, который является ожидаемым значением TProcessor в SqsBackgroundService. Тест настроен и вызывается следующим образом.

Код: Выделить всё

        var mockServiceProvider = new Mock();
var mockServiceScope = new Mock();
mockServiceScope.Setup(x => x.ServiceProvider).Returns(mockServiceProvider.Object);

var mockServiceScopeFactory = new Mock();
mockServiceScopeFactory
.Setup(x => x.CreateScope())
.Returns(mockServiceScope.Object);

mockServiceProvider
.Setup(x => x.GetService(typeof(IServiceScopeFactory)))
.Returns(mockServiceScopeFactory.Object);

....

var messageResult = new MessageResult(true);
var mockClientEntityProcessor = new Mock();
mockClientEntityProcessor.Setup(x => x.ProcessMessage(
It.IsAny(),
It.IsAny()))
.ReturnsAsync(messageResult);

mockServiceProvider
.Setup(x => x.GetService(typeof(IClientEntityProcessor)))
.Returns(mockClientEntityProcessor.Object);

....

var service = new ClientEntityListener(
mockServiceProvider.Object,
_mockBackgroundConfig.Object,
_mockQueueConfig.Object,
mockBaseLogger.Object);

await service.Execute(mockServiceProvider.Object, CancellationToken.None);

При запуске этого теста линия

Код: Выделить всё

var result = await messageProcessor.ProcessMessage(message, token);
внутри SqsBackgroundService возвращает значение null вместо ожидаемого messageResult. Под ложными вызовами я вижу, что он вызывает IMessageProcessor.ProcessMessage. Однако, если я запустил те же строки в тестовой настройке, они будут

Код: Выделить всё

 var scope = mockServiceProvider.Object.CreateScope();
var processor = scope.ServiceProvider.GetService();
var test = await processor.ProcessMessage(messages[0], CancellationToken.None);
Я вижу, что результатом теста является messageResult, как и ожидалось, однако вызов макета — IClientEntityProcessor.ProcessMessage. Это наводит меня на мысль, что проблема заключается в вызове базового метода IMessageProcessor.ProcessMessage, который не высмеивается в текущей настройке. Мои попытки высмеять вызываемый IMessageProcessor не увенчались успехом. Есть ли способ высмеять это, чтобы оно работало так, как ожидалось?

Подробнее здесь: https://stackoverflow.com/questions/793 ... p-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»