1

我是 Blazor 和 bUnit 的新手。我有呈现编辑表单的组件,并在 OnInitializedAsync 事件中获取表单的值。

我无法弄清楚如何使用 cut.WaitForState() 或 cut.WaitForAssertion()。

这是我的剃须刀代码:

@page "/{AppId:guid}/app-settings-edit"
<section class="app-settings-edit">
    <h1 class="page-title">Application Settings</h1>
    @if (InitializedComplete)
    {
        <p>Hello World</p>
        ...

而我背后的代码:

public partial class AppSettingsEdit
{
    protected bool InitializedComplete;

    [Parameter]
    public Guid AppId { get; set; }

    [ValidateComplexType]
    public AppSettings AppSettings { get; set; } = new AppSettings();

    [Inject]
    public IAppSettingsDataService AppSettingsDataService { get; set; }

    protected override async Task OnInitializedAsync()
    {
        AppSettings = await AppSettingsDataService.Get(AppId);
        InitializedComplete = true;
    }
    ...

这是我的测试:

    [Fact]
    public void MyFact()
    {
        Services.AddSingleton<IAppSettingsDataService, MockAppSettingsDataService>(x => new MockAppSettingsDataService(x.GetRequiredService<HttpClient>()));

        var cut = RenderComponent<AppSettingsEdit>(parameters => parameters
            .Add(p => p.AppId, Guid.Parse("55E5097B-B56A-40D7-8A02-A5B94AAAD6E1"))
        );

        Assert.NotNull(cut.Instance.AppSettingsDataService);

        cut.WaitForState(() => cut.Find("p").TextContent == "Hello World", new TimeSpan(0, 0, 5));
        cut.MarkupMatches("<p>Hello World</p>");
    }

当我调试测试时,我可以看到 OnInitializedAsync 触发,但是我的标记从未更改为包含“Hello World”并且 WaitForState() 命令失败。

4

1 回答 1

0

您确定从您的AppSettingsDataService.Get()方法返回的任务曾经完成吗?

我会确保返回的任务AppSettingsDataService.Get()已经完成,否则你需要在组件渲染后完成任务。有很多方法可以做到这一点,这完全取决于你的模拟是如何实现的。

至于你的WaitFor,你可以只使用WaitForAssertion这种情况下的方法,即:cut.WaitForAssertion(() => cut.MarkupMatches("<p>Hello World</p>"));

一点背景知识:WaitFor*当被测组件异步渲染时使用 这些方法,因为在不同线程中运行的测试不知道何时会发生这种情况。

通常,您永远不需要设置自定义超时,默认值为 1 秒,但WaitFor*每次渲染器发生时,这些方法都会重试断言/谓词。仅当触发渲染的时间超过一秒时,例如,如果您使用 bUnit 执行端到端测试,例如从真实的 Web 服务中提取数据。

于 2021-01-29T08:48:13.423 回答