Почему мой сеанс отладки внезапно завершается во время интеграционного теста, но не во время модульного теста?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему мой сеанс отладки внезапно завершается во время интеграционного теста, но не во время модульного теста?

Сообщение Anonymous »

Я создаю веб-сайт с системой пожертвований на благотворительность в качестве бесплатного проекта. После того, как пользователь сделает памятное пожертвование, необходимо создать 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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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