-
Notifications
You must be signed in to change notification settings - Fork 668
Discussion: find(), is() and contains() are inconsistent #24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
isn't |
I think the behavior of In my mind, We discussed the behavior of I originally thought the behavior should be that the root node is not included in I still think that not including the root node is more intuitive for me. Currently I could run:
and it would return true 😕
It would be good to get more input on this before we release, as it will be difficult to change once it's published. I'll reopen the issue on find's behavior - #5 |
I'm thinking about it this way: You:
Me:
You:
Me:
So I assume the issue there is presumably vue-test-utils will realise the div is a component and wouldn't then know whether to include itself in the contains method. |
@eddyerburgh as there is not much going on here, and a consensus was met already in the past I don't want to hold up the release with this discussion and would lean towards closing it. |
Ok, I'm also happy to close 👍 |
Reopening, because the behavior of contains could be confusing for users. My vote is that we change the behavior of contains to include the Wrapper. |
I think that's a good idea. Though I understand the difference, the current behavior is a bit weird and inconsistent, at least to me, as I've always seen I'd argue that more often than not, to test if the component has been rendered, a user would just check if the root node exists and naturally think of |
After looking into it again, I think changing the behavior of contains to include the wrapper root element is a good idea. const div = document.querySelector('div')
jQuery.contains(div, div) // returns false document.contains includes the element: div.contains(div) // returns true |
I spent some more time in thinking about the consistency of the functions used to interact with the DOM.
So here's the example. The markup looks like this.
and assume it's inside the mounted wrapper.
wrapper.find('div')
returns the wrapping elementwrapper.findAll('div')
returns the wrapping elementwrapper.contains('div')
returns falsewrapper.is('div')
returns trueThat's how it behaves currently. For me this though sparks the questions why find would include the whole markup and contains will start inside the root element. The explanation I found, is that the
is
function kind of messes up the logic. We treat thewrapper
as the wrapping DOM tag, though it's actually a wrapper for the whole Vue component.I would expect that
contains
would also include the root element of the markup, as pretty much the Vue wrapper actually contains adiv
element.So maybe
is
should be used in a different way likewrapper.find('.my-wrapper').is('div')
.That would make sense to me in verifying the returned element is actually the one I'd expect.
So to get the root element, as it is useful for some tests I'd recommend a new method like
node
that will return the root DOM node of the markup.Example:
wrapper.node().is('div')
should return trueIf we then decide, calling
is
on the wrapper directly should do the same as a shortcut, I would totally agree. But Then I'd also expect that thewrapper.contains('div')
should also return true in our current case.wdyt?
The text was updated successfully, but these errors were encountered: