A testing library for Blazor components. Get started testing Blazor components at https://bunit.dev
setparam
doesn't seem to cut it
<MudGrid>
<MudItem xs="12" sm="4">
<MudAutocomplete T="string" Label="US States" @bind-Value="ActiveStringHolder.StringValue" SearchFunc="@Search1"
ResetValueOnEmptyText="@resetValueOnEmptyText"
CoerceText="@coerceText" CoerceValue="@coerceValue"/>
</MudItem>
<MudItem xs="12" sm="4">
<MudButton OnClick="(()=>ToggleValue())" Variant="Variant.Outlined">Toggle Value</MudButton>
</MudItem>
<MudItem xs="12" md="12" class="flex-column">
<MudSwitch @bind-Checked="resetValueOnEmptyText" Color="Color.Primary">Reset Value on empty Text</MudSwitch>
<MudSwitch @bind-Checked="coerceText" Color="Color.Secondary">Coerce Text to Value</MudSwitch>
<MudSwitch @bind-Checked="coerceValue" Color="Color.Tertiary">Coerce Value to Text (if not found)</MudSwitch>
</MudItem>
</MudGrid>
public async Task Autocomplete_ChangeBoundValue()
{
var comp = Context.RenderComponent<AutocompleteChangeBoundObjectTest>();
Console.WriteLine(comp.Markup);
var autocompletecomp = comp.FindComponent<MudAutocomplete<string>>();
var autocomplete = autocompletecomp.Instance;
autocompletecomp.SetParametersAndRender(parameters => parameters.Add(p=> p.DebounceInterval, 0));
autocompletecomp.SetParametersAndRender(parameters => parameters.Add(p => p.CoerceText, true));
// check initial state
autocomplete.Value.Should().Be("Florida");
autocomplete.Text.Should().Be("Florida");
comp.WaitForAssertion(() => autocompletecomp.Find("input").GetAttribute("value").Should().Be("Florida"));//redundant?
//Get the button to toggle the value
var buttonElement = comp.Find("button");
await comp.InvokeAsync(() => buttonElement.Click());
autocomplete.Value.Should().Be("Georgia");
autocomplete.Text.Should().Be("Georgia");
comp.WaitForAssertion(() => autocompletecomp.Find("input").GetAttribute("value").Should().Be("Georgia"));//redundant?
//Change the value of the current bound value component
//insert "Calif"
autocompletecomp.Find("input").Input("Alabam");
await Task.Delay(100);
var args = new KeyboardEventArgs();
args.Key = "Enter";
//press Enter key
autocompletecomp.Find("input").KeyUp(args);
//The value of the input should be California
comp.WaitForAssertion(() => autocompletecomp.Find("input").GetAttribute("value").Should().Be("Alabama"));
autocomplete.Value.Should().Be("Alabama");
autocomplete.Text.Should().Be("Alabama");
//Change the bound object
var markup1 = autocompletecomp.Markup;
await comp.InvokeAsync(()=> buttonElement.Click());
//await comp.InvokeAsync(() => comp.Render());
autocomplete.Value.Should().Be("Florida"); //pass
autocomplete.Text.Should().Be("Florida"); //fail
comp.WaitForAssertion(() => autocompletecomp.Find("input").GetAttribute("value").Should().Be("Florida"));//breaks here:
var markup2 = autocompletecomp.Markup;
autocomplete.Value.Should().Be("Florida");
//autocomplete.Text.Should().Be("Florida");
//Change the bound object back and check again.
//await buttonComp.InvokeAsync(() => button.OnClick.InvokeAsync());
await comp.InvokeAsync(() => buttonElement.Click());
var t1 = autocompletecomp.Find("input").GetAttribute("value");
var t2 = autocompletecomp.Find("input").GetAttribute("text");
autocomplete.Value.Should().Be("Alabama");
autocomplete.Text.Should().Be("Alabama");
}
[Fact]
public void RendersCorrectly() {
using var ctx = new TestContext();
var rc = ctx.RenderComponent<EditForm>(
@<EditForm Model="TestData" >
<DataAnnotationsValidator />
<EnumInputSelect Id="TestCountryId"
@bind-Value="TestData.TestCountry" @bind-Value:event="ValueChanged" />
<ValidationSummary></ValidationSummary>
</EditForm>
);
rc.MarkupMatches(
@<form >
<select id="TestCountryId" class="valid" value="0" >
<option value="128">Default</option>
<option value="129">UnitedStates</option>
</select>
</form>
);
rc.Find("#TestCountryId").Change("129");
rc.Render();
rc.MarkupMatches(
@<form >
<select id="TestCountryId" class="valid" value="129" >
<option value="128">Default</option>
<option value="129">UnitedStates</option>
</select>
</form>
);
}
Render<TCom>(RenderFragment)
might confuse things. That is added as a shorthand for Render(@<MyComp...). FindComponent<MyComp>()
. You use it when you need an IRenderedComponent instead of an IRenderedFragment that Render
gives you. RenderComponent
always return an IRenderedComponent.
await element.FocusAsync()
, the code never continues. I am not really interested in catching focus event, but I don't understand why it gets stuck there and never continues. For net3.1 I have a JSInterop.SetupVoid("myfocusevent", _ => true).SetVoidResult()
but I cannot find anywhere how to handle FocusAsync()
.