Я создаю веб-сайт с системой пожертвований на благотворительность в качестве бесплатного проекта. После того, как пользователь сделает памятное пожертвование, необходимо создать PDF-файл с данью и отправить его получателю.
У меня есть модульный тест для PdfService.GenerateMemorialPdf(...), который работает нормально. Однако при тестировании обработчика событий через очередь задач, которая, в свою очередь, вызывает вышеупомянутый метод, сеанс отладки внезапно прерывается, когда необходимо создать PDF-файл. Я не могу найти никаких исключений.
Если я модифицирую тест для прямого вызова ExecuteAsync (а не Handle() обработчика событий), тест завершится. Поэтому я думаю, что проблема связана с моей стратегией тестирования в отношении очереди задач.
Я младший разработчик с опытом работы несколько месяцев.
Будем очень благодарны за любую помощь!
Код
Обработчик событий является реализацией моего EnqueueingEventHandler, который ставит в очередь ExecuteAsync(). TaskQueue по сути такой же, как описано в Microsoft Learn.
namespace CharityName.Application.Events;
public abstract class EnqueueingEventHandler(IBackgroundTaskQueue taskQueue) : IEventHandler
where TEvent : IEvent
{
public Task Handle(TEvent eventRequest, CancellationToken cancellationToken)
{
taskQueue.QueueBackgroundWorkItemAsync((CancellationToken) => ExecuteAsync(eventRequest, CancellationToken));
return Task.CompletedTask;
}
protected abstract ValueTask ExecuteAsync(TEvent eventRequest, CancellationToken cancellationToken);
}
Вот реализация обработчика событий создания пожертвования, который в настоящее время только генерирует PDF-файл и отправляет его получателю по электронной почте. Это тестируемый метод (тест следует в конце).
namespace CharityName.Application.Events.DonationCreatedEvent;
public class DonationCreatedEventHandler(
ILogger logger,
IPdfService pdfService,
IEmailService emailService,
IBackgroundTaskQueue taskQueue)
: EnqueueingEventHandler(taskQueue)
{
protected override async ValueTask ExecuteAsync(DonationCreatedEvent eventRequest, CancellationToken cancellationToken)
{
logger.LogInformation("Event {event} is being dequeued from the taskqueue", typeof(DonationCreatedEvent));
string? pdf = null;
if (eventRequest.DonationDto.DonationType == Domain.Enums.DonationType.Memorial)
{
pdf = pdfService.GenerateMemorialPdf(eventRequest.LetterDto.FullName, eventRequest.LetterDto.Message, PdfImage.heart_filled);
}
var res = await emailService.SendRecieptAsync(
EmailTemplate.reciept,
eventRequest.DonorDto.Email,
eventRequest.DonorDto.FirstName,
pdf,
"Temporary");
return;
}
}
Вот PdfService. Обратите внимание на комментарий, указывающий место сбоя сеанса отладки. Помните, что этот метод отлично работает в модульном тесте.
namespace CharityName.Infrastructure.Services.PdfService;
public class PdfService: IPdfService
{
private const string BaseImagePath = "Services/PdfService/Resources/";
public string GenerateMemorialPdf(string honoreeName, string message, PdfImage image)
{
// Temporary code, this does not throw
var imagePath = BaseImagePath + image + ".png";
if (!File.Exists(imagePath))
{
throw new FileNotFoundException($"Image file not found at path: {imagePath}");
}
var documentModel = new MemorialDocumentModel()
{
HonoreeName = honoreeName,
Message = message,
Image = new Image() { Location = BaseImagePath + image + ".png"}
};
var document = new MemorialDocument(documentModel);
var pdf = document.GeneratePdf(); //
Подробнее здесь: https://stackoverflow.com/questions/791 ... t-not-unit
Почему мой сеанс отладки внезапно завершается во время интеграционного теста, но не во время модульного теста? ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Сборка отладки Gradle внезапно завершается сбоем из-за невозможности получить зависимости
Anonymous » » в форуме Android - 0 Ответы
- 22 Просмотры
-
Последнее сообщение Anonymous
-