模拟xunit测试IJSRuntime [英] mock xunit testing IJSRuntime

查看:24
本文介绍了模拟xunit测试IJSRuntime的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的Blazor应用程序中,我正在尝试测试删除代码,当单击该按钮时,它将运行以下代码以显示确认对话框:

public async Task DeleteDocument(DocumentViewModel document)
{
    bool confirmed = await JsRuntime.InvokeAsync<bool>("confirm", "Are you sure?");

    if (confirmed)
    {
        ... do some delete code here
    }

在我的测试项目中,我有这样一行:

    _mockJsRuntime
        .Setup(js => js.InvokeAsync<bool>(It.IsAny<string>(), It.IsAny<object>()))
        .Returns(ValueTask.FromResult(true));

当我运行测试时,我收到以下错误:

不能在安装/验证表达式中使用扩展方法(此处为:JSRunimeExtensions.InvokeAsync)。

如何才能测试我的DeleteDocument方法?

推荐答案

若要能够模拟方法返回,模拟类型必须是接口,或者该方法必须标记为抽象或虚拟。

在您的示例中,您不能模拟扩展方法,因为它不是虚拟方法。通常,扩展方法最终会调用接口中声明的方法,在这种情况下,您可以很容易地查看源代码here

这样您就可以更改安装程序,使其与IJSRuntime接口中声明的方法签名匹配。

_mockJsRuntime
    .Setup(js => js.InvokeAsync<bool>(It.IsAny<string>(), It.IsAny<object[]>()))
    .Returns(ValueTask.FromResult(true));

这篇关于模拟xunit测试IJSRuntime的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆