Посредник модульного тестирования опубликовал ожидаемое INotificationC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Гость
 Посредник модульного тестирования опубликовал ожидаемое INotification

Сообщение Гость »


У меня есть серверное приложение 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 = "Привет! :)"; используя var updateNotifierMonitor = _notifier.Monitor(); // Действовать вар публикацииMessageResult = ждут _messageService.PublishMessage (метка времени, имя пользователя, сообщение); // Утверждать PublishMessageResult.Should().BeTrue(); updateNotifierMonitor.Should() .Raise(nameof(_notifier.MessagePublished)) .WithArgs(args => args.Timestamp.Equals(метка времени) && args.Username.Equals(имя пользователя) && args.Message.Equals(сообщение)); } } В моей миграции я изменил удаление IUpdateNotifier/UpdateNotifier. Вместо этого MessageService использует IMediator. И вместо MessagePublishedEventArgs есть MessagePublishedNotification, который реализует INotification.

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

Я не вижу здесь смысла над чем-то издеваться. Я хочу использовать реальную реализацию для всего.
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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