123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681 |
- <!DOCTYPE HTML>
- <html lang="en" >
- <head>
- <meta charset="UTF-8">
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <title>Testing · Vuex</title>
- <meta http-equiv="X-UA-Compatible" content="IE=edge" />
- <meta name="description" content="">
- <meta name="generator" content="GitBook 3.2.2">
-
-
-
-
- <link rel="stylesheet" href="../gitbook/style.css">
-
-
-
- <link rel="stylesheet" href="../gitbook/gitbook-plugin-prism/prism.css">
-
-
-
- <link rel="stylesheet" href="../gitbook/gitbook-plugin-search/search.css">
-
-
-
- <link rel="stylesheet" href="../gitbook/gitbook-plugin-theme-vuejs/vue.css">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <meta name="HandheldFriendly" content="true"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
- <meta name="apple-mobile-web-app-capable" content="yes">
- <meta name="apple-mobile-web-app-status-bar-style" content="black">
- <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../gitbook/images/apple-touch-icon-precomposed-152.png">
- <link rel="shortcut icon" href="../gitbook/images/favicon.ico" type="image/x-icon">
-
- <link rel="next" href="hot-reload.html" />
-
-
- <link rel="prev" href="forms.html" />
-
- </head>
- <body>
-
- <div class="book">
- <div class="book-summary">
-
-
- <div id="book-search-input" role="search">
- <input type="text" placeholder="Type to search" />
- </div>
-
- <nav role="navigation">
-
- <script async type="text/javascript" src="//cdn.carbonads.com/carbon.js?zoneid=1673&serve=C6AILKT&placement=vuejs" id="_carbonads_js"></script>
- <ul class="summary">
-
-
-
-
-
-
-
- <li class="chapter " data-level="1.1" data-path="./">
-
- <a href="./">
-
-
- Introduction
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.2" >
-
- <a target="_blank" href="https://github.com/vuejs/vuex/releases">
-
-
- Release Notes
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.3" data-path="installation.html">
-
- <a href="installation.html">
-
-
- Installation
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.4" data-path="intro.html">
-
- <a href="intro.html">
-
-
- What is Vuex?
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.5" data-path="getting-started.html">
-
- <a href="getting-started.html">
-
-
- Getting Started
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.6" data-path="core-concepts.html">
-
- <a href="core-concepts.html">
-
-
- Core Concepts
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="1.6.1" data-path="state.html">
-
- <a href="state.html">
-
-
- State
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.6.2" data-path="getters.html">
-
- <a href="getters.html">
-
-
- Getters
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.6.3" data-path="mutations.html">
-
- <a href="mutations.html">
-
-
- Mutations
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.6.4" data-path="actions.html">
-
- <a href="actions.html">
-
-
- Actions
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.6.5" data-path="modules.html">
-
- <a href="modules.html">
-
-
- Modules
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
- <li class="chapter " data-level="1.7" data-path="structure.html">
-
- <a href="structure.html">
-
-
- Application Structure
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.8" data-path="plugins.html">
-
- <a href="plugins.html">
-
-
- Plugins
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.9" data-path="strict.html">
-
- <a href="strict.html">
-
-
- Strict Mode
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.10" data-path="forms.html">
-
- <a href="forms.html">
-
-
- Form Handling
-
- </a>
-
-
- </li>
-
- <li class="chapter active" data-level="1.11" data-path="testing.html">
-
- <a href="testing.html">
-
-
- Testing
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.12" data-path="hot-reload.html">
-
- <a href="hot-reload.html">
-
-
- Hot Reloading
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.13" data-path="api.html">
-
- <a href="api.html">
-
-
- API Reference
-
- </a>
-
-
- </li>
-
-
- <li class="divider"></li>
- <li>
- <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
- Published with GitBook
- </a>
- </li>
- </ul>
- </nav>
-
-
- </div>
- <div class="book-body">
-
- <div class="body-inner">
-
-
-
- <div class="book-header" role="navigation">
-
- <!-- Title -->
- <h1>
- <i class="fa fa-circle-o-notch fa-spin"></i>
- <a href="." >Testing</a>
- </h1>
- </div>
- <div class="page-wrapper" tabindex="-1" role="main">
- <div class="page-inner">
-
- <div id="book-search-results">
- <div class="search-noresults">
-
- <section class="normal markdown-section">
-
- <h1 id="testing">Testing</h1>
- <p>The main parts we want to unit test in Vuex are mutations and actions.</p>
- <h3 id="testing-mutations">Testing Mutations</h3>
- <p>Mutations are very straightforward to test, because they are just functions that completely rely on their arguments. One trick is that if you are using ES2015 modules and put your mutations inside your <code>store.js</code> file, in addition to the default export, you should also export the mutations as a named export:</p>
- <pre class="language-"><code class="lang-js"><span class="token keyword">const</span> state <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span>
- <span class="token comment" spellcheck="true">// export `mutations` as a named export</span>
- <span class="token keyword">export</span> <span class="token keyword">const</span> mutations <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span>
- <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">new</span> <span class="token class-name">Vuex<span class="token punctuation">.</span>Store</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
- state<span class="token punctuation">,</span>
- mutations
- <span class="token punctuation">}</span><span class="token punctuation">)</span>
- </code></pre>
- <p>Example testing a mutation using Mocha + Chai (you can use any framework/assertion libraries you like):</p>
- <pre class="language-"><code class="lang-js"><span class="token comment" spellcheck="true">// mutations.js</span>
- <span class="token keyword">export</span> <span class="token keyword">const</span> mutations <span class="token operator">=</span> <span class="token punctuation">{</span>
- increment<span class="token punctuation">:</span> state <span class="token operator">=</span><span class="token operator">></span> state<span class="token punctuation">.</span>count<span class="token operator">++</span>
- <span class="token punctuation">}</span>
- </code></pre>
- <pre class="language-"><code class="lang-js"><span class="token comment" spellcheck="true">// mutations.spec.js</span>
- <span class="token keyword">import</span> <span class="token punctuation">{</span> expect <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'chai'</span>
- <span class="token keyword">import</span> <span class="token punctuation">{</span> mutations <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./store'</span>
- <span class="token comment" spellcheck="true">// destructure assign `mutations`</span>
- <span class="token keyword">const</span> <span class="token punctuation">{</span> increment <span class="token punctuation">}</span> <span class="token operator">=</span> mutations
- <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'mutations'</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> <span class="token punctuation">{</span>
- <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'INCREMENT'</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> <span class="token punctuation">{</span>
- <span class="token comment" spellcheck="true">// mock state</span>
- <span class="token keyword">const</span> state <span class="token operator">=</span> <span class="token punctuation">{</span> count<span class="token punctuation">:</span> <span class="token number">0</span> <span class="token punctuation">}</span>
- <span class="token comment" spellcheck="true">// apply mutation</span>
- <span class="token function">increment</span><span class="token punctuation">(</span>state<span class="token punctuation">)</span>
- <span class="token comment" spellcheck="true">// assert result</span>
- <span class="token function">expect</span><span class="token punctuation">(</span>state<span class="token punctuation">.</span>count<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span><span class="token number">1</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>
- </code></pre>
- <h3 id="testing-actions">Testing Actions</h3>
- <p>Actions can be a bit more tricky because they may call out to external APIs. When testing actions, we usually need to do some level of mocking - for example, we can abstract the API calls into a service and mock that service inside our tests. In order to easily mock dependencies, we can use webpack and <a href="https://github.com/plasticine/inject-loader" target="_blank">inject-loader</a> to bundle our test files.</p>
- <p>Example testing an async action:</p>
- <pre class="language-"><code class="lang-js"><span class="token comment" spellcheck="true">// actions.js</span>
- <span class="token keyword">import</span> shop <span class="token keyword">from</span> <span class="token string">'../api/shop'</span>
- <span class="token keyword">export</span> <span class="token keyword">const</span> getAllProducts <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">{</span> commit <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
- <span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'REQUEST_PRODUCTS'</span><span class="token punctuation">)</span>
- shop<span class="token punctuation">.</span><span class="token function">getProducts</span><span class="token punctuation">(</span>products <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
- <span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'RECEIVE_PRODUCTS'</span><span class="token punctuation">,</span> products<span class="token punctuation">)</span>
- <span class="token punctuation">}</span><span class="token punctuation">)</span>
- <span class="token punctuation">}</span>
- </code></pre>
- <pre class="language-"><code class="lang-js"><span class="token comment" spellcheck="true">// actions.spec.js</span>
- <span class="token comment" spellcheck="true">// use require syntax for inline loaders.</span>
- <span class="token comment" spellcheck="true">// with inject-loader, this returns a module factory</span>
- <span class="token comment" spellcheck="true">// that allows us to inject mocked dependencies.</span>
- <span class="token keyword">import</span> <span class="token punctuation">{</span> expect <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'chai'</span>
- <span class="token keyword">const</span> actionsInjector <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'inject-loader!./actions'</span><span class="token punctuation">)</span>
- <span class="token comment" spellcheck="true">// create the module with our mocks</span>
- <span class="token keyword">const</span> actions <span class="token operator">=</span> <span class="token function">actionsInjector</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
- <span class="token string">'../api/shop'</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
- getProducts <span class="token punctuation">(</span>cb<span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token function">setTimeout</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> <span class="token punctuation">{</span>
- <span class="token function">cb</span><span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token comment" spellcheck="true">/* mocked response */</span> <span class="token punctuation">]</span><span class="token punctuation">)</span>
- <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">100</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>
- <span class="token comment" spellcheck="true">// helper for testing action with expected mutations</span>
- <span class="token keyword">const</span> testAction <span class="token operator">=</span> <span class="token punctuation">(</span>action<span class="token punctuation">,</span> payload<span class="token punctuation">,</span> state<span class="token punctuation">,</span> expectedMutations<span class="token punctuation">,</span> done<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
- <span class="token keyword">let</span> count <span class="token operator">=</span> <span class="token number">0</span>
- <span class="token comment" spellcheck="true">// mock commit</span>
- <span class="token keyword">const</span> commit <span class="token operator">=</span> <span class="token punctuation">(</span>type<span class="token punctuation">,</span> payload<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
- <span class="token keyword">const</span> mutation <span class="token operator">=</span> expectedMutations<span class="token punctuation">[</span>count<span class="token punctuation">]</span>
- <span class="token keyword">try</span> <span class="token punctuation">{</span>
- <span class="token function">expect</span><span class="token punctuation">(</span>type<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span>mutation<span class="token punctuation">.</span>type<span class="token punctuation">)</span>
- <span class="token keyword">if</span> <span class="token punctuation">(</span>payload<span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token function">expect</span><span class="token punctuation">(</span>payload<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span>deep<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span>mutation<span class="token punctuation">.</span>payload<span class="token punctuation">)</span>
- <span class="token punctuation">}</span>
- <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token function">done</span><span class="token punctuation">(</span>error<span class="token punctuation">)</span>
- <span class="token punctuation">}</span>
- count<span class="token operator">++</span>
- <span class="token keyword">if</span> <span class="token punctuation">(</span>count <span class="token operator">>=</span> expectedMutations<span class="token punctuation">.</span>length<span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
- <span class="token punctuation">}</span>
- <span class="token punctuation">}</span>
- <span class="token comment" spellcheck="true">// call the action with mocked store and arguments</span>
- <span class="token function">action</span><span class="token punctuation">(</span><span class="token punctuation">{</span> commit<span class="token punctuation">,</span> state <span class="token punctuation">}</span><span class="token punctuation">,</span> payload<span class="token punctuation">)</span>
- <span class="token comment" spellcheck="true">// check if no mutations should have been dispatched</span>
- <span class="token keyword">if</span> <span class="token punctuation">(</span>expectedMutations<span class="token punctuation">.</span>length <span class="token operator">===</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token function">expect</span><span class="token punctuation">(</span>count<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>
- <span class="token function">done</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">describe</span><span class="token punctuation">(</span><span class="token string">'actions'</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> <span class="token punctuation">{</span>
- <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'getAllProducts'</span><span class="token punctuation">,</span> done <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
- <span class="token function">testAction</span><span class="token punctuation">(</span>actions<span class="token punctuation">.</span>getAllProducts<span class="token punctuation">,</span> <span class="token keyword">null</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>
- <span class="token punctuation">{</span> type<span class="token punctuation">:</span> <span class="token string">'REQUEST_PRODUCTS'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
- <span class="token punctuation">{</span> type<span class="token punctuation">:</span> <span class="token string">'RECEIVE_PRODUCTS'</span><span class="token punctuation">,</span> payload<span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">/* mocked response */</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>
- <span class="token punctuation">]</span><span class="token punctuation">,</span> done<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>
- </code></pre>
- <p>If you have spies available in your testing environment (for example via <a href="http://sinonjs.org/" target="_blank">Sinon.JS</a>), you can use them instead of the <code>testAction</code> helper:</p>
- <pre class="language-"><code class="lang-js"><span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'actions'</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> <span class="token punctuation">{</span>
- <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'getAllProducts'</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> <span class="token punctuation">{</span>
- <span class="token keyword">const</span> commit <span class="token operator">=</span> sinon<span class="token punctuation">.</span><span class="token function">spy</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
- <span class="token keyword">const</span> state <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
- actions<span class="token punctuation">.</span><span class="token function">getAllProducts</span><span class="token punctuation">(</span><span class="token punctuation">{</span> commit<span class="token punctuation">,</span> state <span class="token punctuation">}</span><span class="token punctuation">)</span>
- <span class="token function">expect</span><span class="token punctuation">(</span>commit<span class="token punctuation">.</span>args<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span>deep<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
- <span class="token punctuation">[</span><span class="token string">'REQUEST_PRODUCTS'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
- <span class="token punctuation">[</span><span class="token string">'RECEIVE_PRODUCTS'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">/* mocked response */</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><span class="token punctuation">)</span>
- <span class="token punctuation">}</span><span class="token punctuation">)</span>
- </code></pre>
- <h3 id="testing-getters">Testing Getters</h3>
- <p>If your getters have complicated computation, it is worth testing them. Getters are also very straightforward to test as same reason as mutations.</p>
- <p>Example testing a getter:</p>
- <pre class="language-"><code class="lang-js"><span class="token comment" spellcheck="true">// getters.js</span>
- <span class="token keyword">export</span> <span class="token keyword">const</span> getters <span class="token operator">=</span> <span class="token punctuation">{</span>
- filteredProducts <span class="token punctuation">(</span>state<span class="token punctuation">,</span> <span class="token punctuation">{</span> filterCategory <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token keyword">return</span> state<span class="token punctuation">.</span>products<span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span>product <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
- <span class="token keyword">return</span> product<span class="token punctuation">.</span>category <span class="token operator">===</span> filterCategory
- <span class="token punctuation">}</span><span class="token punctuation">)</span>
- <span class="token punctuation">}</span>
- <span class="token punctuation">}</span>
- </code></pre>
- <pre class="language-"><code class="lang-js"><span class="token comment" spellcheck="true">// getters.spec.js</span>
- <span class="token keyword">import</span> <span class="token punctuation">{</span> expect <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'chai'</span>
- <span class="token keyword">import</span> <span class="token punctuation">{</span> getters <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./getters'</span>
- <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'getters'</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> <span class="token punctuation">{</span>
- <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'filteredProducts'</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> <span class="token punctuation">{</span>
- <span class="token comment" spellcheck="true">// mock state</span>
- <span class="token keyword">const</span> state <span class="token operator">=</span> <span class="token punctuation">{</span>
- products<span class="token punctuation">:</span> <span class="token punctuation">[</span>
- <span class="token punctuation">{</span> id<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">,</span> title<span class="token punctuation">:</span> <span class="token string">'Apple'</span><span class="token punctuation">,</span> category<span class="token punctuation">:</span> <span class="token string">'fruit'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
- <span class="token punctuation">{</span> id<span class="token punctuation">:</span> <span class="token number">2</span><span class="token punctuation">,</span> title<span class="token punctuation">:</span> <span class="token string">'Orange'</span><span class="token punctuation">,</span> category<span class="token punctuation">:</span> <span class="token string">'fruit'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
- <span class="token punctuation">{</span> id<span class="token punctuation">:</span> <span class="token number">3</span><span class="token punctuation">,</span> title<span class="token punctuation">:</span> <span class="token string">'Carrot'</span><span class="token punctuation">,</span> category<span class="token punctuation">:</span> <span class="token string">'vegetable'</span> <span class="token punctuation">}</span>
- <span class="token punctuation">]</span>
- <span class="token punctuation">}</span>
- <span class="token comment" spellcheck="true">// mock getter</span>
- <span class="token keyword">const</span> filterCategory <span class="token operator">=</span> <span class="token string">'fruit'</span>
- <span class="token comment" spellcheck="true">// get the result from the getter</span>
- <span class="token keyword">const</span> result <span class="token operator">=</span> getters<span class="token punctuation">.</span><span class="token function">filteredProducts</span><span class="token punctuation">(</span>state<span class="token punctuation">,</span> <span class="token punctuation">{</span> filterCategory <span class="token punctuation">}</span><span class="token punctuation">)</span>
- <span class="token comment" spellcheck="true">// assert the result</span>
- <span class="token function">expect</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span>deep<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
- <span class="token punctuation">{</span> id<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">,</span> title<span class="token punctuation">:</span> <span class="token string">'Apple'</span><span class="token punctuation">,</span> category<span class="token punctuation">:</span> <span class="token string">'fruit'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
- <span class="token punctuation">{</span> id<span class="token punctuation">:</span> <span class="token number">2</span><span class="token punctuation">,</span> title<span class="token punctuation">:</span> <span class="token string">'Orange'</span><span class="token punctuation">,</span> category<span class="token punctuation">:</span> <span class="token string">'fruit'</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>
- <span class="token punctuation">}</span><span class="token punctuation">)</span>
- </code></pre>
- <h3 id="running-tests">Running Tests</h3>
- <p>If your mutations and actions are written properly, the tests should have no direct dependency on Browser APIs after proper mocking. Thus you can simply bundle the tests with webpack and run it directly in Node. Alternatively, you can use <code>mocha-loader</code> or Karma + <code>karma-webpack</code> to run the tests in real browsers.</p>
- <h4 id="running-in-node">Running in Node</h4>
- <p>Create the following webpack config (together with proper <a href="https://babeljs.io/docs/usage/babelrc/" target="_blank"><code>.babelrc</code></a>):</p>
- <pre class="language-"><code class="lang-js"><span class="token comment" spellcheck="true">// webpack.config.js</span>
- module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span>
- entry<span class="token punctuation">:</span> <span class="token string">'./test.js'</span><span class="token punctuation">,</span>
- output<span class="token punctuation">:</span> <span class="token punctuation">{</span>
- path<span class="token punctuation">:</span> __dirname<span class="token punctuation">,</span>
- filename<span class="token punctuation">:</span> <span class="token string">'test-bundle.js'</span>
- <span class="token punctuation">}</span><span class="token punctuation">,</span>
- module<span class="token punctuation">:</span> <span class="token punctuation">{</span>
- loaders<span class="token punctuation">:</span> <span class="token punctuation">[</span>
- <span class="token punctuation">{</span>
- test<span class="token punctuation">:</span> <span class="token regex">/\.js$/</span><span class="token punctuation">,</span>
- loader<span class="token punctuation">:</span> <span class="token string">'babel-loader'</span><span class="token punctuation">,</span>
- exclude<span class="token punctuation">:</span> <span class="token regex">/node_modules/</span>
- <span class="token punctuation">}</span>
- <span class="token punctuation">]</span>
- <span class="token punctuation">}</span>
- <span class="token punctuation">}</span>
- </code></pre>
- <p>Then:</p>
- <pre class="language-"><code class="lang-bash">webpack
- mocha test-bundle.js
- </code></pre>
- <h4 id="running-in-browser">Running in Browser</h4>
- <ol>
- <li>Install <code>mocha-loader</code>.</li>
- <li>Change the <code>entry</code> from the webpack config above to <code>'mocha-loader!babel-loader!./test.js'</code>.</li>
- <li>Start <code>webpack-dev-server</code> using the config.</li>
- <li>Go to <code>localhost:8080/webpack-dev-server/test-bundle</code>.</li>
- </ol>
- <h4 id="running-in-browser-with-karma--karma-webpack">Running in Browser with Karma + karma-webpack</h4>
- <p>Consult the setup in <a href="https://vue-loader.vuejs.org/en/workflow/testing.html" target="_blank">vue-loader documentation</a>.</p>
-
- </section>
-
- </div>
- <div class="search-results">
- <div class="has-results">
-
- <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
- <ul class="search-results-list"></ul>
-
- </div>
- <div class="no-results">
-
- <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
-
- </div>
- </div>
- </div>
- </div>
- </div>
-
- <script src="//m.servedby-buysellads.com/monetization.js" type="text/javascript"></script>
- <div class="bsa-cpc"></div>
- <script>
- (function(){
- if(typeof _bsa !== 'undefined' && _bsa) {
- _bsa.init('default', 'CKYD62QM', 'placement:vuejsorg', {
- target: '.bsa-cpc',
- align: 'horizontal',
- disable_css: 'true'
- });
- }
- })();
- </script>
- </div>
-
-
- <a href="forms.html" class="navigation navigation-prev " aria-label="Previous page: Form Handling">
- <i class="fa fa-angle-left"></i>
- </a>
-
-
- <a href="hot-reload.html" class="navigation navigation-next " aria-label="Next page: Hot Reloading">
- <i class="fa fa-angle-right"></i>
- </a>
-
-
-
- </div>
- <script>
- var gitbook = gitbook || [];
- gitbook.push(function() {
- gitbook.page.hasChanged({"page":{"title":"Testing","level":"1.11","depth":1,"next":{"title":"Hot Reloading","level":"1.12","depth":1,"path":"hot-reload.md","ref":"hot-reload.md","articles":[]},"previous":{"title":"Form Handling","level":"1.10","depth":1,"path":"forms.md","ref":"forms.md","articles":[]},"dir":"ltr"},"config":{"plugins":["edit-link","prism","-highlight","github","-highlight","github"],"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"edit-link":{"label":"Edit This Page","base":"https://github.com/vuejs/vuex/tree/dev/docs"},"github":{"url":"https://github.com/vuejs/vuex/"},"prism":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":false,"twitter":false,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-vuejs":{},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"Vuex","language":"en","links":{"sharing":{"facebook":false,"twitter":false}},"gitbook":"2.x.x"},"file":{"path":"testing.md","mtime":"2018-04-20T00:44:03.854Z","type":"markdown"},"gitbook":{"version":"3.2.2","time":"2018-04-20T00:47:55.633Z"},"basePath":".","book":{"language":"en"}});
- });
- </script>
- </div>
-
- <script src="../gitbook/gitbook.js"></script>
- <script src="../gitbook/theme.js"></script>
-
-
- <script src="../gitbook/gitbook-plugin-edit-link/plugin.js"></script>
-
-
-
- <script src="../gitbook/gitbook-plugin-github/plugin.js"></script>
-
-
-
- <script src="../gitbook/gitbook-plugin-search/search-engine.js"></script>
-
-
-
- <script src="../gitbook/gitbook-plugin-search/search.js"></script>
-
-
-
- <script src="../gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
-
-
-
- <script src="../gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
-
-
-
- <script src="../gitbook/gitbook-plugin-sharing/buttons.js"></script>
-
-
- </body>
- </html>
|