Я использую 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());
... но получил то же исключение.





В пакете Blazored LocalStorage есть специальный пакет bUnit, который позволяет вам это сделать. См. документацию здесь: https://github.com/Blazored/LocalStorage?tab=readme-ov-file#testing-with-bunit
Ну, отрежь мне обе ноги и называй меня Коротышкой! Не могу поверить, что я это пропустил! Большое спасибо
Хм, кажется, я заговорил слишком рано. Я попробовал использовать этот пакет, но получил ошибку. Пожалуйста, посмотрите мой обновленный вопрос.
Я подозреваю, что вы очень близки, но допустили одну небольшую ошибку.
Вы добавили макет в сервисы до или после создания тестового компонента? Если бы это было после, это объяснило бы исключение.
Попробуй это...
// 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;
Ах, глупый я. Имеет смысл теперь, когда вы указываете на это. Спасибо
Services.AddScoped<ILocalStorageService, MyMockLocalStorageService>();