У меня есть серверное приложение Blazor, которое использует события для запуска обновлений между клиентами. Я решил перенести это, чтобы вместо этого использовать MediatR для запуска обновлений. Фактическая реализация работает, но я застрял на модульных тестах. Раньше я использовал FluentAssertions с IMonitor для проверки возникновения события. Теперь я хочу сделать что-то подобное с MediatR. Я видел связанные с этим вопросы на SO, где люди отвечали: «Вам не следует тестировать внутренние компоненты MediatR». В моем случае я уверен, что не тестирую внутренности MediatR. Я хочу проверить, действительно ли уведомление было опубликовано с ожидаемыми значениями.
Сначала я покажу свою рабочую реализацию с событиями. Важными частями здесь являются служба, которая выполняет некоторую бизнес-логику и запускает событие, если все выглядит хорошо, класс UpdateNotifier, который предоставляет событие и методы для его запуска, и, наконец, есть модульный тест, который проверяет сервис.
публичный класс MessageService { частный только для чтения IUpdateNotifier _notifier; общедоступная служба сообщений (уведомитель IUpdateNotifier) { _notifier = уведомитель; } public async Task PublishMessage (временная метка DateTimeOffset, строковое имя пользователя, строковое сообщение) { if (string.IsNullOrWhiteSpace(имя пользователя) || string.IsNullOrWhiteSpace(сообщение)) { вернуть ложь; } _notifier.FireMessagePublished(метка времени, имя пользователя, сообщение); вернуть истину; } } общедоступный класс UpdateNotifier: IUpdateNotifier { публичное событие EventHandler? СообщениеОпубликовано; public void FireMessagePublished (временная метка DateTimeOffset, строковое имя пользователя, строковое сообщение) { MessagePublished?.Invoke(this, new MessagePublishedEventArgs(метка времени, имя пользователя, сообщение)); } } общедоступный класс MessagePublishedEventArgs { public MessagePublishedEventArgs (метка времени DateTimeOffset, строковое имя пользователя, строковое сообщение) { Временная метка = временная метка; Имя пользователя = имя пользователя; Сообщение = сообщение; } public DateTimeOffset Timestamp {get; в этом; } публичная строка Имя пользователя {get; в этом; } общественная строка Сообщение {получить; в этом; } } общедоступный класс MessageServiceTests { частный только для чтения IUpdateNotifier _notifier; частный MessageService только для чтения _messageService; публичный MessageServiceTests() { _notifier = новый UpdateNotifier(); _messageService = новый MessageService(_notifier); } [Факт] общедоступная асинхронная задача PublishMessage_MessagePublished_HasExpectedValues() { // Договариваться вар временная метка = DateTimeOffset.Now; вар имя пользователя = "Эрик"; var message = "Привет!

public async Task PublishMessage (временная метка DateTimeOffset, строковое имя пользователя, строковое сообщение) { if (string.IsNullOrWhiteSpace(имя пользователя) || string.IsNullOrWhiteSpace(сообщение)) { вернуть ложь; } ждут _mediator.Publish(новое MessagePublishedNotification(метка времени, имя пользователя, сообщение)); вернуть истину; } Есть ли способ написать модульный тест так же, как мой исходный модульный тест, но при этом проверять, был ли опубликован INotification ожидаемого типа с ожидаемыми значениями?
Я не вижу здесь смысла над чем-то издеваться. Я хочу использовать реальную реализацию для всего.