Как выполнить модульное тестирование eShopOnContainer (IntegrationEventsLog) - PullRequest
0 голосов
/ 08 февраля 2019

Этот вопрос конкретно относится к eshoponcontainers https://github.com/dotnet-architecture/eShopOnContainers и, более конкретно, к сервису IntegrationEvengLog.

У меня есть следующий класс, который мне нужно сменить, и он передан

IEventsContextIntegrationEventService integrationService = NEEDS MOCKING;
var handler = new CreateCoinCommandHandler(context, mapper, integrationService);`

Я уже высмеял context с помощью dbcontext в памяти, маппер уже позаботился, единственный параметр, который мне нужен, это integrationService, который также принимает context, и у него есть свой собственный dbcontext, который должен быть

Вот мой класс службы интеграции, который я не знаю, как правильно смоделировать (предпочитаю использовать в памяти, как я, для `context.

Извините за неопределенность, ноне уверен как еще это поставить

public class EventsContextIntegrationEventService: IEventsContextIntegrationEventService
{
    private readonly Func<DbConnection, IIntegrationEventLogService> integrationEventLogServiceFactory;
    private readonly IEventBus eventBus;
    private readonly EventsContext context;
    private readonly IIntegrationEventLogService eventLogService;

    public EventsContextIntegrationEventService(IEventBus eventBus, EventsContext context,
    Func<DbConnection, IIntegrationEventLogService> integrationEventLogServiceFactory)
    {
        this.context = context ?? throw new ArgumentNullException(nameof(context));
        this.integrationEventLogServiceFactory = integrationEventLogServiceFactory ?? throw new ArgumentNullException(nameof(integrationEventLogServiceFactory));
        this.eventBus = eventBus ?? throw new ArgumentNullException(nameof(eventBus));
        eventLogService = this.integrationEventLogServiceFactory(this.context.Database.GetDbConnection());
    }

    public async Task PublishThroughEventBusAsync(IntegrationEvent evt)
    {
        try
        {
            await eventLogService.MarkEventAsInProgressAsync(evt.Id);
            eventBus.Publish(evt);
            await eventLogService.MarkEventAsPublishedAsync(evt.Id);
        }
        catch (Exception)
        {
            await eventLogService.MarkEventAsFailedAsync(evt.Id);
        }
    }

    public async Task SaveIntegrationEventAndEventContextChangesAsync(IntegrationEvent evt)
    {
        //Use of an EF Core resiliency strategy when using multiple DbContexts within an explicit BeginTransaction():
        //See: https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency            
        await ResilientTransaction.New(context)
            .ExecuteAsync(async () => {
                // Achieving atomicity between original catalog database operation and the IntegrationEventLog thanks to a local transaction
                await context.SaveChangesAsync();
                await eventLogService.SaveEventAsync(evt, context.Database.CurrentTransaction.GetDbTransaction());
            });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...