模拟IJSRuntime用于Blazor组件单元测试

时间:2019-10-28 10:51:29

标签: c# unit-testing moq blazor

this prototype之后进行单元测试时,在使用JS互操作时遇到了一个问题。

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

仅添加使用IJSRuntime的组件将导致以下异常

  

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

JS互操作没有做任何有趣的事情,它只是一个将元素作为焦点的void函数-我不在乎对其进行测试,我只希望能够继续为组件本身编写测试。< / p>

如何使用Moq模拟IJSRuntime?

当我尝试类似的东西

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

    host.AddService(jsRuntimeMock);

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

我仍然有例外

2 个答案:

答案 0 :(得分:4)

host.AddService(jsRuntimeMock);

Mock<IJSRuntime>注册为依赖项。

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

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

赞:

host.AddService(jsRuntimeMock.Object);

答案 1 :(得分:0)

Microsoft使用了大量内部Singleton,因此很难在应用程序级别进行测试,因此您应该替换所有默认服务,例如IJSRuntime,NavigationManager和NavigationInterceptor。我希望在下一个预览版中,将有一种简单的方法来创建单元测试方法并模拟浏览器。