模拟 IJSRuntime 进行 Blazor 组件单元测试

8

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

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

仅仅添加一个使用IJSRuntime的组件就会导致以下异常:
System.InvalidOperationException:无法为类型“Application.Components.MyComponent”上的属性'JsRuntime'提供值。没有注册类型为“Microsoft.JSInterop.IJSRuntime”的服务。
JS互操作并没有做任何有趣的事情,它只是一个聚焦元素的空函数 - 我不关心测试它,我只想能够继续编写组件本身的测试。
如何使用Moq来模拟IJSRuntime?
当我尝试像这样做时:
[Test]
public void ExampleTest()
{
    var jsRuntimeMock = new Mock<IJSRuntime>();

    host.AddService(jsRuntimeMock);

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

我仍然收到异常

2个回答

8
host.AddService(jsRuntimeMock);

Mock<IJSRuntime> 注册为依赖项。

实现中的任何类(测试程序集以外的类)都不应该有此类依赖关系,但往往会犯这个错误。

使用 Mock<T> 属性 ObjectIJSRuntime 注册为依赖项,其中包含一个实现该接口的对象的引用。

像这样:

host.AddService(jsRuntimeMock.Object);

非常好,我只是有点误解了。谢谢! - p3tch

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接