Search for elements
vue-test-utils
provides a way to find and confirm the presence of html elements or other Vue components using the find
method. The use of find
is to confirm that a component is rendered exactly an element or a subcomponent.
The source code for the tests described on this page can be found here .
Create components
In this example, we will create the <Child>
and <Parent>
.
Child:
1 2 3 4 5 6 7 8 9 10 | <span class="token operator"><</span> template <span class="token operator">></span> <span class="token operator"><</span> div <span class="token operator">></span> Child <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> template <span class="token operator">></span> <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">"Child"</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
Parent:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <span class="token operator"><</span> template <span class="token operator">></span> <span class="token operator"><</span> div <span class="token operator">></span> <span class="token operator"><</span> span v <span class="token operator">-</span> show <span class="token operator">=</span> <span class="token string">"showSpan"</span> <span class="token operator">></span> Parent Component <span class="token operator"><</span> <span class="token operator">/</span> span <span class="token operator">></span> <span class="token operator"><</span> Child v <span class="token operator">-</span> <span class="token keyword">if</span> <span class="token operator">=</span> <span class="token string">"showChild"</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> template <span class="token operator">></span> <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">import</span> Child <span class="token keyword">from</span> <span class="token string">"./Child.vue"</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">"Parent"</span> <span class="token punctuation">,</span> components <span class="token punctuation">:</span> <span class="token punctuation">{</span> Child <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function">data</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> showSpan <span class="token punctuation">:</span> <span class="token boolean">false</span> <span class="token punctuation">,</span> showChild <span class="token punctuation">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
find
with querySelector
syntax
Conventional elements can easily be selected using the syntax of document.querySelector
. vue-test-utils
also provides an isVisible
method to test v-show
conditionally rendered elements. Create a Parent.spec.js
, and inside the file we add the following code:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">import</span> <span class="token punctuation">{</span> mount <span class="token punctuation">,</span> shallowMount <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"@vue/test-utils"</span> <span class="token keyword">import</span> Parent <span class="token keyword">from</span> <span class="token string">"@/components/Parent.vue"</span> <span class="token function">describe</span> <span class="token punctuation">(</span> <span class="token string">"Parent"</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">it</span> <span class="token punctuation">(</span> <span class="token string">"does not render a span"</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> wrapper <span class="token operator">=</span> <span class="token function">shallowMount</span> <span class="token punctuation">(</span> Parent <span class="token punctuation">)</span> <span class="token function">expect</span> <span class="token punctuation">(</span> wrapper <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> <span class="token string">"span"</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">isVisible</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toBe</span> <span class="token punctuation">(</span> <span class="token boolean">false</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
Because v-show="showSpan"
defaults to false
, we expect that the <span>
of the element found isVisible
will return false
. The test will pass when running with yarn test:unit
. Next, another test will be performed around showSpan
case showSpan
is true.
1 2 3 4 5 6 7 8 9 10 | <span class="token function">it</span> <span class="token punctuation">(</span> <span class="token string">"does render a span"</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> wrapper <span class="token operator">=</span> <span class="token function">shallowMount</span> <span class="token punctuation">(</span> Parent <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token function">data</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> showSpan <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token function">expect</span> <span class="token punctuation">(</span> wrapper <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> <span class="token string">"span"</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">isVisible</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toBe</span> <span class="token punctuation">(</span> <span class="token boolean">true</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
Of course will pass! Like isVisible
for v-show
, vue-test-utils
provides an exists
method which is used when checking render elements with v-if
.
Find components with name
and Component
Finding child components is a bit different than finding regular HTML elements. There will be two main ways to confirm the presence of child components:
find(Component)
find({ name: "ComponentName" })
A little easier to understand in the context of a test example. We will start with the find(Component)
syntax. This requires that we import
components and pass it to the find
function.
1 2 3 4 5 6 7 8 | <span class="token keyword">import</span> Child <span class="token keyword">from</span> <span class="token string">"@/components/Child.vue"</span> <span class="token function">it</span> <span class="token punctuation">(</span> <span class="token string">"does not render a Child component"</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> wrapper <span class="token operator">=</span> <span class="token function">shallowMount</span> <span class="token punctuation">(</span> Parent <span class="token punctuation">)</span> <span class="token function">expect</span> <span class="token punctuation">(</span> wrapper <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> Child <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">exists</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toBe</span> <span class="token punctuation">(</span> <span class="token boolean">false</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
The implementation of find
is complex, as it works with querySelector
, as well as some other syntax. You can see part of the source that finds the Vue child components described here . Basically, it checks the component’s name
for each rendered child, then checks the constructor
and some other properties.
As mentioned in the previous paragraph, the name
attribute is one of the checks that are find
when you run through a component. Instead of transferring components, you can simply pass an object with the exact name
attribute. This means you do not need to import
components. Let’s check the case when <Child>
is rendered:
1 2 3 4 5 6 7 8 9 10 | <span class="token function">it</span> <span class="token punctuation">(</span> <span class="token string">"renders a Child component"</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> wrapper <span class="token operator">=</span> <span class="token function">shallowMount</span> <span class="token punctuation">(</span> Parent <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token function">data</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> showChild <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token function">expect</span> <span class="token punctuation">(</span> wrapper <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">"Child"</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">exists</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toBe</span> <span class="token punctuation">(</span> <span class="token boolean">true</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
It kicked the pass! Using the name
property may be a bit less intuitive, so entering the actual component is an alternative. Another option is to simply add a class
or id
and query using the querySelector
shown in the first two examples.
findAll
There are often cases when you want to assert that some elements are rendered. Some common cases are a list of items that are redner with v-for
. This is one of <ParentWithManyChildren>
that renders the <Child>
components.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token operator"><</span> template <span class="token operator">></span> <span class="token operator"><</span> div <span class="token operator">></span> <span class="token operator"><</span> Child v <span class="token operator">-</span> <span class="token keyword">for</span> <span class="token operator">=</span> <span class="token string">"id in [1, 2 ,3]"</span> <span class="token punctuation">:</span> key <span class="token operator">=</span> <span class="token string">"id"</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> template <span class="token operator">></span> <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">import</span> Child <span class="token keyword">from</span> <span class="token string">"./Child.vue"</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">"ParentWithManyChildren"</span> <span class="token punctuation">,</span> components <span class="token punctuation">:</span> <span class="token punctuation">{</span> Child <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
We can write test tests by findAll
confirming that the three <Child>
components will be rendered like this:
1 2 3 4 5 6 | <span class="token function">it</span> <span class="token punctuation">(</span> <span class="token string">"renders many children"</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> wrapper <span class="token operator">=</span> <span class="token function">shallowMount</span> <span class="token punctuation">(</span> ParentWithManyChildren <span class="token punctuation">)</span> <span class="token function">expect</span> <span class="token punctuation">(</span> wrapper <span class="token punctuation">.</span> <span class="token function">findAll</span> <span class="token punctuation">(</span> Child <span class="token punctuation">)</span> <span class="token punctuation">.</span> length <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toBe</span> <span class="token punctuation">(</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
Running yarn test:unit
will display the passed test. You can use the querySelector
syntax with findAll
.
Conclude
This page includes:
- Use
find
andfindAll
with thequerySelector
syntax isVisible
andexists
- Use
find
andfindAll
with the component or name of the selected part
The source code for the test described on this page can be found here .