{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/javascript-testing-anti-patterns","result":{"data":{"markdownRemark":{"id":"ad910f04-3023-513e-9a46-996306dcd2a8","html":"<p>There are a handful of anti-patterns I see repeatedly in JavaScript test code. Here we’ll go over two simple traps I often see, and how to avoid them to make your tests more concise, maintainable, readable, and trustworthy.</p>\n<h1 id=\"-anti-pattern-1-test-objects-initialized-in-each-test\"><a href=\"#-anti-pattern-1-test-objects-initialized-in-each-test\" aria-label=\" anti pattern 1 test objects initialized in each test permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>❌ Anti-pattern #1: Test objects initialized in each test</h1>\n<p>Consider the following oversimplified example, in which our <code class=\"language-text\">mockUser</code> test object is initialized in each test case:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">validateUser</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> userId <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">typeof</span> userId <span class=\"token operator\">===</span> <span class=\"token string\">'string'</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'The user validation'</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>\n\t<span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should succeed when the user is valid'</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>\n\t\t<span class=\"token keyword\">const</span> mockUser <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n\t\t\tuserId<span class=\"token operator\">:</span> <span class=\"token string\">'theUserId'</span><span class=\"token punctuation\">,</span>\n\t\t\tname<span class=\"token operator\">:</span> <span class=\"token string\">'John Smith'</span><span class=\"token punctuation\">,</span>\n\t\t\tlanguage<span class=\"token operator\">:</span> <span class=\"token string\">'en-US'</span>\n\t\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n\t\t<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token function\">validateUser</span><span class=\"token punctuation\">(</span>mockUser<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>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t<span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should fail when the user is invalid'</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>\n\t\t<span class=\"token keyword\">const</span> mockUser <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n\t\t\tname<span class=\"token operator\">:</span> <span class=\"token string\">'John Smith'</span><span class=\"token punctuation\">,</span>\n\t\t\tlanguage<span class=\"token operator\">:</span> <span class=\"token string\">'en-US'</span>\n\t\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n\t\t<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token function\">validateUser</span><span class=\"token punctuation\">(</span>mockUser<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>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>This seems straightforward. What’s wrong in this example?</p>\n<ol>\n<li><strong>It’s verbose</strong>. Imagine what happens when instead of two tests we have 24, and instead of three properties, our user objects have 11.</li>\n<li><strong>Test objects are duplicated</strong>. As our test suite and business logic grow over time, developers will have to modify each individual test. This is toilsome, error prone, and likely to be forgotten.</li>\n<li><strong>Our second test isn’t very readable</strong>. It’s not intuitive why <code class=\"language-text\">mockUser</code> is invalid without reading the surrounding code and understanding the validation logic.</li>\n</ol>\n<h1 id=\"-anti-pattern-2-test-objects-initialized-in-a-describe-block\"><a href=\"#-anti-pattern-2-test-objects-initialized-in-a-describe-block\" aria-label=\" anti pattern 2 test objects initialized in a describe block permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>❌ Anti-pattern #2: Test objects initialized in a <code class=\"language-text\">describe</code> block</h1>\n<p>Let’s look at a common way that anti-pattern is resolved, and then we’ll see why this is itself an anti-pattern:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">validateUser</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">user</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">typeof</span> user<span class=\"token punctuation\">.</span>userId <span class=\"token operator\">===</span> <span class=\"token string\">'string'</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'The user validation'</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>\n\t<span class=\"token keyword\">const</span> <span class=\"token constant\">MOCK_USER</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n\t\tuserId<span class=\"token operator\">:</span> <span class=\"token string\">'theUserId'</span><span class=\"token punctuation\">,</span>\n\t\tname<span class=\"token operator\">:</span> <span class=\"token string\">'John Smith'</span><span class=\"token punctuation\">,</span>\n\t\tlanguage<span class=\"token operator\">:</span> <span class=\"token string\">'en-US'</span>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n\t<span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should succeed when the user is valid'</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>\n\t\t<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token function\">validateUser</span><span class=\"token punctuation\">(</span><span class=\"token constant\">MOCK_USER</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>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t<span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should fail when the user is invalid'</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>\n\t\t<span class=\"token keyword\">delete</span> <span class=\"token constant\">MOCK_USER</span><span class=\"token punctuation\">.</span>userId<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token function\">validateUser</span><span class=\"token punctuation\">(</span><span class=\"token constant\">MOCK_USER</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>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Wait - this looks great, you say. We declare our user object once! And what’s more, our second test explicitly deletes the <code class=\"language-text\">userId</code> property, making the test much more readable!</p>\n<p>The problem is that our tests now share the same reference to our user object, meaning that any single test can <strong>mutate</strong> our user object for following tests. This can cause <strong>false positives</strong> (tests failing when they should pass) or <strong>false negatives</strong> (tests passing when they should fail).</p>\n<p>As we’ll see, false negatives are especially insidious because they often mask bugs, creating a false sense of security.</p>\n<p>Consider what happens when a developer comes along and adds a new test, asserting that users need a <code class=\"language-text\">language</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">validateUser</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">user</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">typeof</span> user<span class=\"token punctuation\">.</span>userId <span class=\"token operator\">===</span> <span class=\"token string\">'string'</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'The user validation'</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>\n\t<span class=\"token keyword\">const</span> <span class=\"token constant\">MOCK_USER</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n\t\tuserId<span class=\"token operator\">:</span> <span class=\"token string\">'theUserId'</span><span class=\"token punctuation\">,</span>\n\t\tname<span class=\"token operator\">:</span> <span class=\"token string\">'John Smith'</span><span class=\"token punctuation\">,</span>\n\t\tlanguage<span class=\"token operator\">:</span> <span class=\"token string\">'en-US'</span>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n\t<span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should succeed when the user is valid'</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>\n\t\t<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token function\">validateUser</span><span class=\"token punctuation\">(</span><span class=\"token constant\">MOCK_USER</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>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t<span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should fail when the user is invalid'</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>\n\t\t<span class=\"token keyword\">delete</span> <span class=\"token constant\">MOCK_USER</span><span class=\"token punctuation\">.</span>userId<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token function\">validateUser</span><span class=\"token punctuation\">(</span><span class=\"token constant\">MOCK_USER</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>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t<span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should fail when the user has no language'</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>\n\t\t<span class=\"token keyword\">delete</span> <span class=\"token constant\">MOCK_USER</span><span class=\"token punctuation\">.</span>language<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token function\">validateUser</span><span class=\"token punctuation\">(</span><span class=\"token constant\">MOCK_USER</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>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The new behavior hasn’t even been implemented, but the test still passes!</p>\n<p>That’s because the previous test deleted the <code class=\"language-text\">userId</code> property, so our user object is still invalid when our new test executes.</p>\n<h1 id=\"-best-practice-test-objects-initialized-in-a-beforeeach-block\"><a href=\"#-best-practice-test-objects-initialized-in-a-beforeeach-block\" aria-label=\" best practice test objects initialized in a beforeeach block permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>✅ Best Practice: Test objects initialized in a <code class=\"language-text\">beforeEach</code> block</h1>\n<p>To avoid these hard-to-catch mutable-state bugs, test objects should be initialized in a <code class=\"language-text\">beforeEach</code> block:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">validateUser</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">user</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">typeof</span> user<span class=\"token punctuation\">.</span>userId <span class=\"token operator\">===</span> <span class=\"token string\">'string'</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'The user validation'</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>\n\n\t<span class=\"token keyword\">let</span> mockUser<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token function\">beforeEach</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>\n\t\tmockUser <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n\t\t\tuserId<span class=\"token operator\">:</span> <span class=\"token string\">'theUserId'</span><span class=\"token punctuation\">,</span>\n\t\t\tname<span class=\"token operator\">:</span> <span class=\"token string\">'John Smith'</span><span class=\"token punctuation\">,</span>\n\t\t\tlanguage<span class=\"token operator\">:</span> <span class=\"token string\">'en-US'</span>\n\t\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t<span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should succeed when the user is valid'</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>\n\t\t<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token function\">validateUser</span><span class=\"token punctuation\">(</span>mockUser<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>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t<span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should fail when the user is invalid'</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>\n\t\t<span class=\"token keyword\">delete</span> mockUser<span class=\"token punctuation\">.</span>userId<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token function\">validateUser</span><span class=\"token punctuation\">(</span>mockUser<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>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t<span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should fail when the user has no language'</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>\n\t\t<span class=\"token keyword\">delete</span> mockUser<span class=\"token punctuation\">.</span>language<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token function\">validateUser</span><span class=\"token punctuation\">(</span>mockUser<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>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Now our last test fails like we expect it to, and the developer is reminded to actually implement their new feature ;)</p>\n<p>By re-initializing test objects before each test, our tests are guaranteed to be <strong>independent</strong>. That is, the behavior of one test won’t affect the result of another.</p>\n<p>We’ve also made our tests more concise, readable, and reduced duplication.</p>\n<p>Happy testing!</p>","fields":{"slug":"/posts/javascript-testing-anti-patterns","tagSlugs":["/tag/code/"]},"frontmatter":{"date":"2019-11-04T06:52:26.516Z","description":"How not to initialize test objects: avoid these practices to make tests more concise, maintainable, readable, and trustworthy.","tags":["Code"],"title":"JavaScript Testing Anti-Patterns"}}},"pageContext":{"slug":"/posts/javascript-testing-anti-patterns"}},"staticQueryHashes":["251939775","401334301","4025097228"]}