Как мне высмеять введенный LocalStorageService - это тест bUnit?

Я использую bUnit для тестирования компонента Blazor, но застрял в попытке имитировать следующую внедренную зависимость в компоненте...

  [Inject]
  public ILocalStorageService LocalStorage { get; set; } = null!;

Мой основной код для создания экземпляра тестируемого компонента:

TestComponentSender cut = RenderComponent<TestComponentSender>(ps => ps
    .Add(p => p.NotificationHelper, new TestNotificationHelper())
).Instance;

Я не могу использовать метод Add так же, как с параметром NotificationHelper, поскольку вводится свойство локального хранилища, а не параметр.

Я попытался добавить следующую строку перед приведенной выше...

Services.AddScoped<ILocalStorageService>();

...но это дает исключение при запуске теста...

Невозможно создать экземпляр типа реализации «Blazored.LocalStorage.ILocalStorageService» для типа службы «Blazored.LocalStorage.ILocalStorageService».

Я попытался сослаться на пакет NSubstitute Nuget и добавить следующую строку после создания компонента...

cut.LocalStorage = Substitute.For<ILocalStorageService>();

...но это дало другое исключение...

Невозможно указать значение свойства LocalStorage для типа InspiredGiving.Crm.Areas.General.Shared.TestComponentSender. Не существует зарегистрированной службы типа Blazored.LocalStorage.ILocalStorageService.

Кто-нибудь может посоветовать, как мне издеваться над этой введенной зависимостью?

Обновление. После ответа Эгиля я установил тестовый пакет bUnit и сделал что-то похожее на код на странице GitHub...

TestComponentSender cut = RenderComponent<TestComponentSender>(ps => ps
  .Add(p => p.NotificationHelper, new TestNotificationHelper())
).Instance;
cut.LocalStorage = this.AddBlazoredLocalStorage();

Однако это стало исключением...

System.InvalidOperationException: невозможно указать значение свойства LocalStorage для типа InspiredGiving.Crm.Areas.General.Shared.TestComponentSender. Нет зарегистрированной службы типа «Blazored.LocalStorage.ILocalStorageService».

Я попробовал использовать подход, показанный Робертом Харви в его комментарии...

Services.AddScoped<ILocalStorageService>(_ => this.AddBlazoredLocalStorage());

... но получил то же исключение.

Services.AddScoped<ILocalStorageService, MyMockLocalStorageService>();
Robert Harvey 17.06.2024 22:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В пакете Blazored LocalStorage есть специальный пакет bUnit, который позволяет вам это сделать. См. документацию здесь: https://github.com/Blazored/LocalStorage?tab=readme-ov-file#testing-with-bunit

Ну, отрежь мне обе ноги и называй меня Коротышкой! Не могу поверить, что я это пропустил! Большое спасибо

Avrohom Yisroel 18.06.2024 14:48

Хм, кажется, я заговорил слишком рано. Я попробовал использовать этот пакет, но получил ошибку. Пожалуйста, посмотрите мой обновленный вопрос.

Avrohom Yisroel 18.06.2024 15:19
Ответ принят как подходящий

Я подозреваю, что вы очень близки, но допустили одну небольшую ошибку.

Вы добавили макет в сервисы до или после создания тестового компонента? Если бы это было после, это объяснило бы исключение.

Попробуй это...

// Register mock before creating cut
Services.AddScoped<ILocalStorageService>(_ => this.AddBlazoredLocalStorage());
// Now we can create the cut
TestComponentSender cut = RenderComponent<TestComponentSender>(ps => ps
  .Add(p => p.NotificationHelper, new TestNotificationHelper())
).Instance;

Ах, глупый я. Имеет смысл теперь, когда вы указываете на это. Спасибо

Avrohom Yisroel 18.06.2024 18:59

Другие вопросы по теме