Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
  • Oct 27 15:10
    dnfadmin commented #542
  • Oct 27 15:10
    dnfadmin commented #541
  • Oct 27 15:10
    dependabot[bot] labeled #542
  • Oct 27 15:10
    dependabot[bot] opened #542
  • Oct 27 15:10
    dependabot[bot] labeled #541
  • Oct 27 15:10
    dependabot[bot] opened #541
  • Oct 25 15:09
    dnfadmin commented #537
  • Oct 25 15:09
    dependabot[bot] labeled #537
  • Oct 25 15:09
    dependabot[bot] opened #537
  • Oct 25 13:50
    egil closed #535
  • Oct 25 13:50
    egil locked #535
  • Oct 25 13:50
    egil commented #535
  • Oct 25 13:27
    drma-dev opened #535
  • Oct 23 16:31
    egil commented #529
  • Oct 23 16:27
    egil labeled #532
  • Oct 23 16:27
    egil opened #532
  • Oct 23 16:24
    egil closed #529
  • Oct 23 16:24
    egil commented #529
  • Oct 23 15:41
    egil closed #528
  • Oct 23 15:41
    egil locked #528
Ivan Josipovic
@IvanJosipovic
@Purendra-naik-ascendlearning-com, MudBlazor has pretty comprehensive Tests, have a look how they teste the IDialogService here, https://github.com/Garderoben/MudBlazor/blob/0696c060fd3b952eb96b81b97ac7e8ea922ac5c8/src/MudBlazor.UnitTests/Components/DialogTests.cs
1 reply
Kevin Ciliento
@Keviento

Hi ! My team and I are pretty new with Bunit and Blazor and we were wondering if there is a clean way to assert that a component has not been rendered in an Integration test context where the component under test is always the Index component and all services are injected with their real implementation excepting the HttpClient that is mocked with the suggested NuGet.

Currently, we are relying on time to assert that its has not been rendered like the following :

Action getComponentX = () => cut.FindComponent<X>;
cut.WaitForAssertion(() =>getComponentX.Should().Throw<WaitForFailedException>(), TimeSpan.FromSeconds(3));

A concrete exemple of the production use case would be when there is an @if statement.
Also, is there any hook letting us know when the Index and all its child component has finished rendering and all the async initialization have been completed ?
Thanks !

Egil Hansen
@egilhansen:matrix.org
[m]

hi @Keviento

in general, after a call to RenderComponent (or Render), the full render tree has been created. Then you can use cut.WaitForState. Its predicate will be called after each render, so if you have one or more async renders happening after the initial render, that predicate will be called after each.

To find out if a component exists in the render tree or not (e.g. if it has been rendered), I would probably use cut.HasComponent<T>(). It returns false if there is no child component in the render tree of that type.
Alternative is cut.FindComponents<T>().Count == 0
jhcorey
@jhcorey
Hello, I'm having a difficult time tracking down an example for mouse events. Specifically we're doing a mouse over to bring up a tool tip. The document page has a list... The built-in dispatch event helpers are: ...which includes Mouse Events, but what appears to be a link does nothing. Are there examples anywhere? Thanks!
1 reply
Brett McDonald
@bfmsoft
var cut = ctx.RenderComponent<BfmEnumInputSelect>(); I am getting that that is a namespace. My project is called BfmEnumInputSelect and component called BfmEnumInputSelect. Hw do I specify the component name? Or how do I find the name of the component? Been working on other stuff for a few months and converting to new version of BUnit, BTW love it.
11 replies
Egil Hansen
@egilhansen:matrix.org
[m]
You'll probably want to look at the new way of writing tests in razor files: https://bunit.dev/docs/getting-started/writing-tests.html#write-tests-in-cs-or-razor-files
Brett McDonald
@bfmsoft
image.png
I was just typing and ran a test and then it matched but, I am puzzled. It shouldn't match? Am I missing something?
This is .Net 6.0 and bUnit 1.2.49
SQL-MisterMagoo
@SQL-MisterMagoo
@bfmsoft I'm no bUnit expert, but it looks right - as you passed a RenderFragment into MarkupMatches - which will need to be rendered, which means the rendered markup to match is the <form> and matches the cut markup which is also a <form> ? As I say, I could be wrong.
Brett McDonald
@bfmsoft
The typo was that I passed the same markup twice. It shouldn't match.
I think I stand corrected, I must render the second batch and then check it. So it does match. My mistake
Egil Hansen
@egilhansen:matrix.org
[m]
Great, sounds right :)
gismofx
@gismofx
Hey everyone. Is there an example somewhere for perform a two-way binding parameter on a component? I.e. simulate changing the value via UI and then changing via code?
Egil Hansen
@egilhansen:matrix.org
[m]
@gismofx are you writing tests in razor or cs files?
Egil Hansen
@egilhansen:matrix.org
[m]
In razor files its super easy. Just define a local variable in your test, and bind it to the parameter like normal, e.g. Render(@<MyComp @bind-Value="variable" />)
Then you trigger whatever you need in the component to make it update the value, e.g. a click handler, and then you can assert against the local variable.
With .cs based tests, you just need to both pass in the original variable to the "Value" parameter, and a func that should be invoked when the value changes to the "ValueChanged" parameter.
I'm on my phone now, so hard to show more code, but do let me know if it answers it for you.
gismofx
@gismofx
@egilhansen:matrix.org I'm doing tests in .cs. Ill take a crack at it and come back if any questions. Thanks!
Egil Hansen
@egilhansen:matrix.org
[m]
@gismofx: if you have a component MyComp with an input field that is linked/bound to a Value parameter, and when it is changed, the ValueChanged EventCallback is triggered, then the following should work:
var value = "initial";
var cut = RenderComponent<MyComp>(ps => ps.Add(p => p.Value, value).Add(p => p.ValueChanged, x => value = x)));

cut.Find("input").Change("new value");

Assert.Equal("new value", value);
Here we are passing in the initial value (optional), and then we're passing in a lambda that to the ValueChanged parameter. In the lambda we simply update the value field in the test, so we know that it was triggered.
Egil Hansen
@egilhansen:matrix.org
[m]
Now, in a razor based test, the code is a little more simple:
var value = "initial"
var cut = Render(@<MyComp @bind-Value="value" />);

cut.Find("input").Change("new value");

Assert.Equal("new value", value);
These two tests does the same.
Obviously. I am assuming that doing a cut.Find("input").Change("new value"); triggers the MyComp component to push changes to its ValueChanged parameter.
Hope this helps.
Egil Hansen
@egilhansen:matrix.org
[m]
@gismofx: somebody actually had a similar question on StackOverflow, so here is a more detailed answer for you: https://stackoverflow.com/a/69141650/32809
gismofx
@gismofx
@egilhansen:matrix.org Thank you! I'm looking forward to implementing very soon. I'm asking the repo owners if they prefer cs tests over razor before I commit to the repo.
HUY Phan
@viethuyphan
Hi guys, Are there any ways to test the context menu of table (Syncfusion TreeGrid)? Thanks!
gismofx
@gismofx
I'm testing a component and it's display value is two-way bound. Using setparam doesn't seem to invoke the binding
Egil Hansen
@egilhansen:matrix.org
[m]
@gismofx: what is setparam?
gismofx
@gismofx
@egilhansen:matrix.org Good question... I didn't know either. It's a wrapper method in MudBlazor test project. https://github.com/MudBlazor/MudBlazor/blob/dev/src/MudBlazor.UnitTests/Extensions/IRenderedComponentExtensions.cs
now that I know that, I would rather to vanilla bunit
basically, I need to mockup user inputting data into the text field
I'm not checking the binding itself, but the rendering after the binding.. but this setparam doesn't seem to cut it
Egil Hansen
@egilhansen:matrix.org
[m]
Hmm not sure where to start helping you. Bunit comes with SetParametersAndRender that should work
My version, unlike theirs, is actually strongly typed: https://bunit.dev/docs/interaction/trigger-renders.html#setparametersandrender
gismofx
@gismofx
yea, I will try that
here's my component razor
<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>
I'm changing the value of @bind-Value="ActiveStringHolder.StringValue" via the UI
so it should update the object
gismofx
@gismofx
Pressing the toggle button switches ActiveStringHolder's value
The display will update correctly. If the user changes the StringValue, it should update ActiveStringHolder and update the display
Egil Hansen
@egilhansen:matrix.org
[m]
Ok. are you a maintainer of mud blazor?
gismofx
@gismofx
@egilhansen:matrix.org a contributor :)
justin-feist
@justin-feist
Ok all, I am trying to write bUnit tests using razor files. Test Explorer (VS 2019) sees my "MessageCenter_RendersPage" test, but when it goes to actually execute I get a "No test matches the given testcase filter....." error in the Output window. The test is seen...but not really. I'm missing something, just not exactly sure what.
image.png
5 replies
gismofx
@gismofx
@egilhansen:matrix.org I'm trying more Vanilla approach. I am invoking a button click, but it does not seem to re-render as if I was really using the UI