bUnit-dev / bUnit

bUnit is a testing library for Blazor components that make tests look, feel, and runs like regular unit tests. bUnit makes it easy to render and control a component under test’s life-cycle, pass parameter and inject services into it, trigger event handlers, and verify the rendered markup from the component using a built-in semantic HTML comparer.
https://bunit.dev
MIT License
1.1k stars 104 forks source link

Enable walking component tree #1180

Open egil opened 11 months ago

egil commented 11 months ago

Right now an IRenderedFragment/IRenderedComponent allows users to search for any child complements. However as https://github.com/telerik/blazor-ui/pull/259#issuecomment-1678477209 suggests, it can be useful to go to the root component and parent component.

Much like the DOM api, I think we can expose the following:

Children/GetChildren()
Parent?
Root

There are a few problems here though.

  1. Should we have these as properties of methods. While the component tree is static after each render, there is an overhead in creating RenderedFragment objects for each component in the component tree before they are needed which is the obvious approach with properties.
  2. We cannot meaningfully return an IReadOnlyList<RenderedComponent<T>> from the Children's method/property because T is not the necessary the same type. There could be a generic IReadOnlyList<RenderedComponent<T>> GetChildren<T> that behaves like FindComponents<T> does (except it just searches children and not children's children), and a non-generic IReadOnlyList<RenderedFragment> Children property that returns all children which children.

Neither of these API changes would be conflicting with the FindComponents depth first search methods, so that's a nice bonus.

linkdotnet commented 4 months ago

@egil The given scenario in the referenced ticket doesn't necessarily need walking up the render tree. We could offer a "global" FindComponent/Find that directly starts from our Bunit RootComponent.

egil commented 4 months ago

Through ComponentState, we have the ability to walk up the tree in .NET 8. I do think this is valuable to expose. Maintaining af collection of children may not be worth it with FindComponent.