为 Blazor 组件单元测试模拟 IJSRuntime

p3t*_*tch 6 c# unit-testing moq blazor

按照这个原型进行单元测试,我在使用 JS 互操作时遇到了问题。

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

只是添加一个使用 IJSRuntime 的组件会导致以下异常

System.InvalidOperationException:无法为“Application.Components.MyComponent”类型的属性“JsRuntime”提供值。没有“Microsoft.JSInterop.IJSRuntime”类型的注册服务。

JS 互操作没有做任何有趣的事情,它只是一个关注元素的 void 函数 - 我不在乎测试它,我只想继续为组件本身编写测试。

如何使用 Moq 来模拟 IJSRuntime?

当我尝试类似的东西时

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

    host.AddService(jsRuntimeMock);

    var component = host.AddComponent<MyComponent>();
}
Run Code Online (Sandbox Code Playgroud)

我仍然得到例外

Tew*_*ewr 6

host.AddService(jsRuntimeMock);
Run Code Online (Sandbox Code Playgroud)

注册Mock<IJSRuntime>为依赖项。

实现中的任何类(在测试程序集之外)都不应该有这样的依赖关系,但这是一个常见的错误。

IJSRuntime使用Mock<T>属性注册为依赖项,该属性Object包含对实现接口的对象的引用。

像这样:

host.AddService(jsRuntimeMock.Object);
Run Code Online (Sandbox Code Playgroud)