Я создаю веб-сайт с системой пожертвований на благотворительность в качестве бесплатного проекта. После того, как пользователь сделает памятное пожертвование, необходимо создать 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 ... -taskqueue
Проблемы с тестированием/отладкой TaskQueue ⇐ C#
Место общения программистов C#
-
Anonymous
1730378668
Anonymous
Я создаю веб-сайт с системой пожертвований на благотворительность в качестве бесплатного проекта. После того, как пользователь сделает памятное пожертвование, необходимо создать PDF-файл с данью и отправить его получателю.
У меня есть модульный тест для PdfService.GenerateMemorialPdf(...), который работает нормально. Однако при тестировании обработчика событий через очередь задач, которая, в свою очередь, вызывает вышеупомянутый метод, сеанс отладки внезапно прерывается, когда необходимо создать PDF-файл. Я не могу найти никаких исключений.
Если я модифицирую тест для прямого вызова ExecuteAsync (а не Handle() обработчика событий), тест завершится. Поэтому я думаю, что проблема связана с моей стратегией тестирования в отношении очереди задач.
Я младший разработчик с опытом работы несколько месяцев.
Будем очень благодарны за любую помощь!
[b]Код[/b]
Обработчик событий является реализацией моего 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(); //
Подробнее здесь: [url]https://stackoverflow.com/questions/79143884/issues-testing-debugging-a-taskqueue[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия