Skip to content

when use JSInterop to mock js operation, the test will be blocked #771

Closed

Description

@cysnet

bUnitVersion: 1.7.7 - 1.9.8

when use JSInterop to mock js operation, the test will be blocked.
image
image

razor code as below

@using Syncfusion.Blazor.Popups
@using Syncfusion.Blazor.Inputs

<div id="target">
    <SfDialog Target="#target" Width="500px">
        <DialogTemplates>
            <Header> 登录 </Header>
            <Content>
                <SfTextBox Placeholder="用户" @bind-Value="UserName" FloatLabelType="@FloatLabelType.Always"></SfTextBox>

                <SfTextBox Placeholder="密码" @bind-Value="Password" FloatLabelType="@FloatLabelType.Always" Type="InputType.Password"></SfTextBox>
            </Content>
        </DialogTemplates>
        <DialogButtons>
            <DialogButton id="login" IsPrimary="true" Content="登录" OnClick="@OnBtnClickAsync" />
        </DialogButtons>
    </SfDialog>
</div>


<style>
    #target .e-dialog {
        height: 270px;
    }

    #target {
        height: 500px;
    }
</style>

    public partial class Login
    {
        public string UserName { get; set; }
        public string Password { get; set; }

        [Inject]
        public ILoginService LoginService { get; set; }

        [Inject]
        public AuthenticationStateProvider AuthProvider { get; set; }

        private async Task OnBtnClickAsync()
        {
            if (await LoginService.LoginAsync(UserName, Password))
            {
                await JSRuntime.InvokeVoidAsync("localStorage.setItem", "userName", UserName);
                //System.Diagnostics.Trace.WriteLine("set item done");
                await AuthProvider.GetAuthenticationStateAsync();
                //System.Diagnostics.Trace.WriteLine("get auth state done");
                NavigationManager.NavigateTo("/patch/list");
                //System.Diagnostics.Trace.WriteLine("navigate done");
            }
        }
    }

test code as below

        [Fact]
        public void LoginComponentTest()
        {
            var testUser = "test";
            Services.AddSyncFusionBlazor();
            Services.AddScoped(p =>
            {
                var loginService = new Mock<ILoginService>();
                loginService.Setup(m => m.LoginAsync(testUser, It.IsAny<string>())).ReturnsAsync(true);
                return loginService.Object;
            });

            JSInterop.SetupVoid("localStorage.setItem", "userName", testUser);
            //JSInterop.SetupVoid("localStorage.setItem", _ => true);
            this.AddTestAuthorization().SetAuthorized(testUser);

            var cut = RenderComponent<U9C.SystemManage.Login.Login>();
            cut.Instance.UserName = "test";
            cut.Instance.Password = "123";
            cut.Find("#login").Click();

            cut.WaitForState(() =>
            {
                var navMan = Services.GetRequiredService<FakeNavigationManager>();
                return "http://localhost/patch/list" == navMan.Uri;
            }, TimeSpan.FromSeconds(30));
            System.Diagnostics.Trace.WriteLine(cut.Markup);

            var navMan = Services.GetRequiredService<FakeNavigationManager>();
            Assert.Equal("http://localhost/patch/list", navMan.Uri);
        }

Activity

  1. egil commented on Jun 24, 2022

    @egil
    Member

    Looks like you are missing a SetVoidResult() call after your SetupVoid call, e.g.:

    JSInterop.SetupVoid("localStorage.setItem", "userName", testUser).SetVoidResult();

    If you do not do this, the returned task you await in your component will never complete.

  2. egil commented on Jun 24, 2022

    @egil
    Member

    Ill convert this to a discussion question and close this issue.

  3. locked and limited conversation to collaborators on Jun 24, 2022
  4. converted this issue into a discussion #773 on Jun 24, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions