Перемешивание IJSRuntime для модульных тестов Blazor Component - PullRequest
3 голосов
/ 28 октября 2019

После этого прототипа для модульного тестирования Я столкнулся с проблемой при использовании взаимодействия JS.

[Test]
public void ExampleTest()
{
    var component = host.AddComponent<MyComponent>();
}

Простое добавление компонента, использующего IJSRuntime, приведет к следующему исключению

System.InvalidOperationException: Невозможно предоставить значение для свойства 'JsRuntime' для типа 'Application.Components.MyComponent'. Не существует зарегистрированного сервиса типа «Microsoft.JSInterop.IJSRuntime».

Взаимодействие JS не делает ничего интересного, это просто пустая функция, которая фокусирует элемент - мне все равноо тестировании, я просто хочу иметь возможность приступить к написанию тестов для самого компонента.

Как я могу использовать Moq для насмешки IJSRuntime?

Когда я пытаюсь что-то вроде

[Test]
public void ExampleTest()
{
    var jsRuntimeMock = new Mock<IJSRuntime>();

    host.AddService(jsRuntimeMock);

    var component = host.AddComponent<MyComponent>();
}

Я все еще получаю исключение

1 Ответ

4 голосов
/ 28 октября 2019
host.AddService(jsRuntimeMock);

регистрирует Mock<IJSRuntime> в качестве зависимости.

Никакие классы в реализации (вне тестовой сборки) не должны иметь такую ​​зависимость, но это обычная ошибка.

Зарегистрируйте IJSRuntime как зависимость, используя свойство Mock<T>Object, который содержит ссылку на объект, который реализует интерфейс.

Например:

host.AddService(jsRuntimeMock.Object);
...