<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Testing on Jamal Hansen</title><link>https://jamalhansen.com/tags/testing/</link><description>Recent content in Testing on Jamal Hansen</description><image><title>Jamal Hansen</title><url>https://jamalhansen.com/social-card.png</url><link>https://jamalhansen.com/social-card.png</link></image><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 11 Jan 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jamalhansen.com/tags/testing/index.xml" rel="self" type="application/rss+xml"/><item><title>Stop querying found elements when testing react</title><link>https://jamalhansen.com/blog/stop-querying-found-elements-when-testing-react/</link><pubDate>Sat, 15 Feb 2025 00:00:00 +0000</pubDate><guid>https://jamalhansen.com/blog/stop-querying-found-elements-when-testing-react/</guid><description>Use Testing Library&amp;#39;s within() to query nested elements in one readable line and avoid repeating yourself</description><content:encoded><![CDATA[<p>I&rsquo;ve been working through Stephen Grider&rsquo;s <a href="http://udemy.com/course/react-testing-library-and-jest">React Testing Library and Jest</a> course and stumbled on something that will clean up my tests: the <code>within()</code> function.</p>
<p>There are many times when I find myself drilling into a part of a component to test something nested inside another element. I might take two or three hops to get there:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">within</span><span class="p">,</span> <span class="nx">screen</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;@testing-library/react&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">table</span> <span class="o">=</span> <span class="nx">screen</span><span class="p">.</span><span class="nx">getByRole</span><span class="p">(</span><span class="s2">&#34;table&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">rows</span> <span class="o">=</span> <span class="nx">within</span><span class="p">(</span><span class="nx">table</span><span class="p">).</span><span class="nx">getAllByRole</span><span class="p">(</span><span class="s2">&#34;row&#34;</span><span class="p">)</span>
</span></span></code></pre></div><p>This takes two lines and, more importantly:</p>
<ul>
<li>It isn&rsquo;t immediately clear what I am doing</li>
<li>I declare the <code>table</code> constant when it isn&rsquo;t relevant to anything</li>
</ul>
<p>With <code>within()</code>, you can shorten this to a single readable line:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">rows</span> <span class="o">=</span> <span class="nx">within</span><span class="p">(</span><span class="nx">screen</span><span class="p">.</span><span class="nx">getByRole</span><span class="p">(</span><span class="s2">&#34;table&#34;</span><span class="p">)).</span><span class="nx">getAllByRole</span><span class="p">(</span><span class="s2">&#34;row&#34;</span><span class="p">)</span>
</span></span></code></pre></div><p>I like this because it reads like a sentence and clearly expresses the intention. It also doesn&rsquo;t create a meaningless intermediate constant.</p>
<h2 id="when-to-use-within">When to Use <code>within()</code></h2>
<ul>
<li>Testing a specific row in a table</li>
<li>Checking content inside a modal or card</li>
<li>Any time you need to scope queries to a container</li>
</ul>
<h2 id="a-note-on-async-queries">A Note on Async Queries</h2>
<p>If you&rsquo;re using <code>findBy*</code> queries (which are async), remember to <code>await</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">rows</span> <span class="o">=</span> <span class="nx">within</span><span class="p">(</span><span class="kr">await</span> <span class="nx">screen</span><span class="p">.</span><span class="nx">findByRole</span><span class="p">(</span><span class="s2">&#34;table&#34;</span><span class="p">)).</span><span class="nx">getAllByRole</span><span class="p">(</span><span class="s2">&#34;row&#34;</span><span class="p">)</span>
</span></span></code></pre></div><p>Or if both queries are async:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">button</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">within</span><span class="p">(</span><span class="kr">await</span> <span class="nx">screen</span><span class="p">.</span><span class="nx">findByTestId</span><span class="p">(</span><span class="s2">&#34;modal&#34;</span><span class="p">)).</span><span class="nx">findByRole</span><span class="p">(</span><span class="s2">&#34;button&#34;</span><span class="p">)</span>
</span></span></code></pre></div><p>When possible, prefer <code>getBy*</code> (synchronous) for cleaner one-liners.</p>
<p>Do you have any testing tips you&rsquo;ve learned recently?</p>
]]></content:encoded></item><item><title>Group JUnit Tests with @Nested</title><link>https://jamalhansen.com/blog/group-junit-tests-with-nested/</link><pubDate>Fri, 14 Feb 2025 00:00:00 +0000</pubDate><guid>https://jamalhansen.com/blog/group-junit-tests-with-nested/</guid><description>Use the @Nested annotation to group JUnit tests similar to a describe block in jest</description><content:encoded><![CDATA[<p>I really like the way that I can nest my JavaScript tests using describe blocks. This keeps my tests nicely organized and grouped together in functional blocks which can be super useful when you get a whole lot of tests created.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="nx">describe</span><span class="p">(</span><span class="s2">&#34;my component&#34;</span><span class="p">,</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">describe</span><span class="p">(</span><span class="s2">&#34;validation&#34;</span><span class="p">,</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">it</span><span class="p">(</span><span class="s2">&#34;ensures that user name is provided&#34;</span><span class="p">,</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// test here
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="p">})</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="nx">it</span><span class="p">(</span><span class="s2">&#34;ensures that password is valid&#34;</span><span class="p">,</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// test here
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="p">})</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">describe</span><span class="p">(</span><span class="s2">&#34;when saved&#34;</span><span class="p">,</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">it</span><span class="p">(</span><span class="s2">&#34;displays an indication that mutation is in progress&#34;</span><span class="p">,</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// test here
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="p">})</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="nx">it</span><span class="p">(</span><span class="s2">&#34;provides feedback of success&#34;</span><span class="p">,</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// test here
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="p">})</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="nx">it</span><span class="p">(</span><span class="s2">&#34;provides an error message on failure&#34;</span><span class="p">,</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// test here
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="p">})</span>
</span></span><span class="line"><span class="cl"><span class="p">})</span>
</span></span></code></pre></div><p>I was not aware that you can do something like this in Java with JUnit. Reading through <a href="https://pragprog.com/titles/utj3/pragmatic-unit-testing-in-java-with-junit-third-edition/">Pragmatic Unit Testing in Java with JUnit</a> I found that this functionality is available by making an inner class and using the <code>@Nested</code> annotation.</p>
<p>Note that <code>@Nested</code> is a JUnit 5 feature, so you&rsquo;ll need to import it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.junit.jupiter.api.Nested</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p>Here is an example of how the code above might be organized using JUnit and Java:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">class</span> <span class="nc">MyComponentTest</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nd">@Nested</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">class</span> <span class="nc">Validation</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nd">@Test</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="kt">void</span><span class="w"> </span><span class="nf">ensuresThatUserNameIsProvided</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="c1">// test here</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nd">@Test</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="kt">void</span><span class="w"> </span><span class="nf">ensuresThatPasswordIsValid</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="c1">// test here</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nd">@Nested</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">class</span> <span class="nc">WhenSaved</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nd">@Test</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="kt">void</span><span class="w"> </span><span class="nf">displaysIndicationThatMutationIsInProgress</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="c1">// test here</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nd">@Test</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="kt">void</span><span class="w"> </span><span class="nf">providesFeedbackOfSuccess</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="c1">// test here</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nd">@Test</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="kt">void</span><span class="w"> </span><span class="nf">providesErrorMessageOnFailure</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="c1">// test here</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>One nice bonus: each <code>@Nested</code> class can have its own <code>@BeforeEach</code> setup method, so you can share setup logic within a group without affecting other groups.</p>
<p>I enjoy finding ways to make my testing better and easier to use. Do you have a favorite tip that you use to make your tests better organized?</p>
]]></content:encoded></item></channel></rss>