testing.html 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681
  1. <!DOCTYPE HTML>
  2. <html lang="en" >
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  6. <title>Testing · Vuex</title>
  7. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  8. <meta name="description" content="">
  9. <meta name="generator" content="GitBook 3.2.2">
  10. <link rel="stylesheet" href="../gitbook/style.css">
  11. <link rel="stylesheet" href="../gitbook/gitbook-plugin-prism/prism.css">
  12. <link rel="stylesheet" href="../gitbook/gitbook-plugin-search/search.css">
  13. <link rel="stylesheet" href="../gitbook/gitbook-plugin-theme-vuejs/vue.css">
  14. <meta name="HandheldFriendly" content="true"/>
  15. <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
  16. <meta name="apple-mobile-web-app-capable" content="yes">
  17. <meta name="apple-mobile-web-app-status-bar-style" content="black">
  18. <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../gitbook/images/apple-touch-icon-precomposed-152.png">
  19. <link rel="shortcut icon" href="../gitbook/images/favicon.ico" type="image/x-icon">
  20. <link rel="next" href="hot-reload.html" />
  21. <link rel="prev" href="forms.html" />
  22. </head>
  23. <body>
  24. <div class="book">
  25. <div class="book-summary">
  26. <div id="book-search-input" role="search">
  27. <input type="text" placeholder="Type to search" />
  28. </div>
  29. <nav role="navigation">
  30. <script async type="text/javascript" src="//cdn.carbonads.com/carbon.js?zoneid=1673&serve=C6AILKT&placement=vuejs" id="_carbonads_js"></script>
  31. <ul class="summary">
  32. <li class="chapter " data-level="1.1" data-path="./">
  33. <a href="./">
  34. Introduction
  35. </a>
  36. </li>
  37. <li class="chapter " data-level="1.2" >
  38. <a target="_blank" href="https://github.com/vuejs/vuex/releases">
  39. Release Notes
  40. </a>
  41. </li>
  42. <li class="chapter " data-level="1.3" data-path="installation.html">
  43. <a href="installation.html">
  44. Installation
  45. </a>
  46. </li>
  47. <li class="chapter " data-level="1.4" data-path="intro.html">
  48. <a href="intro.html">
  49. What is Vuex?
  50. </a>
  51. </li>
  52. <li class="chapter " data-level="1.5" data-path="getting-started.html">
  53. <a href="getting-started.html">
  54. Getting Started
  55. </a>
  56. </li>
  57. <li class="chapter " data-level="1.6" data-path="core-concepts.html">
  58. <a href="core-concepts.html">
  59. Core Concepts
  60. </a>
  61. <ul class="articles">
  62. <li class="chapter " data-level="1.6.1" data-path="state.html">
  63. <a href="state.html">
  64. State
  65. </a>
  66. </li>
  67. <li class="chapter " data-level="1.6.2" data-path="getters.html">
  68. <a href="getters.html">
  69. Getters
  70. </a>
  71. </li>
  72. <li class="chapter " data-level="1.6.3" data-path="mutations.html">
  73. <a href="mutations.html">
  74. Mutations
  75. </a>
  76. </li>
  77. <li class="chapter " data-level="1.6.4" data-path="actions.html">
  78. <a href="actions.html">
  79. Actions
  80. </a>
  81. </li>
  82. <li class="chapter " data-level="1.6.5" data-path="modules.html">
  83. <a href="modules.html">
  84. Modules
  85. </a>
  86. </li>
  87. </ul>
  88. </li>
  89. <li class="chapter " data-level="1.7" data-path="structure.html">
  90. <a href="structure.html">
  91. Application Structure
  92. </a>
  93. </li>
  94. <li class="chapter " data-level="1.8" data-path="plugins.html">
  95. <a href="plugins.html">
  96. Plugins
  97. </a>
  98. </li>
  99. <li class="chapter " data-level="1.9" data-path="strict.html">
  100. <a href="strict.html">
  101. Strict Mode
  102. </a>
  103. </li>
  104. <li class="chapter " data-level="1.10" data-path="forms.html">
  105. <a href="forms.html">
  106. Form Handling
  107. </a>
  108. </li>
  109. <li class="chapter active" data-level="1.11" data-path="testing.html">
  110. <a href="testing.html">
  111. Testing
  112. </a>
  113. </li>
  114. <li class="chapter " data-level="1.12" data-path="hot-reload.html">
  115. <a href="hot-reload.html">
  116. Hot Reloading
  117. </a>
  118. </li>
  119. <li class="chapter " data-level="1.13" data-path="api.html">
  120. <a href="api.html">
  121. API Reference
  122. </a>
  123. </li>
  124. <li class="divider"></li>
  125. <li>
  126. <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
  127. Published with GitBook
  128. </a>
  129. </li>
  130. </ul>
  131. </nav>
  132. </div>
  133. <div class="book-body">
  134. <div class="body-inner">
  135. <div class="book-header" role="navigation">
  136. <!-- Title -->
  137. <h1>
  138. <i class="fa fa-circle-o-notch fa-spin"></i>
  139. <a href="." >Testing</a>
  140. </h1>
  141. </div>
  142. <div class="page-wrapper" tabindex="-1" role="main">
  143. <div class="page-inner">
  144. <div id="book-search-results">
  145. <div class="search-noresults">
  146. <section class="normal markdown-section">
  147. <h1 id="testing">Testing</h1>
  148. <p>The main parts we want to unit test in Vuex are mutations and actions.</p>
  149. <h3 id="testing-mutations">Testing Mutations</h3>
  150. <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>
  151. <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>
  152. <span class="token comment" spellcheck="true">// export `mutations` as a named export</span>
  153. <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>
  154. <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>
  155. state<span class="token punctuation">,</span>
  156. mutations
  157. <span class="token punctuation">}</span><span class="token punctuation">)</span>
  158. </code></pre>
  159. <p>Example testing a mutation using Mocha + Chai (you can use any framework/assertion libraries you like):</p>
  160. <pre class="language-"><code class="lang-js"><span class="token comment" spellcheck="true">// mutations.js</span>
  161. <span class="token keyword">export</span> <span class="token keyword">const</span> mutations <span class="token operator">=</span> <span class="token punctuation">{</span>
  162. increment<span class="token punctuation">:</span> state <span class="token operator">=</span><span class="token operator">&gt;</span> state<span class="token punctuation">.</span>count<span class="token operator">++</span>
  163. <span class="token punctuation">}</span>
  164. </code></pre>
  165. <pre class="language-"><code class="lang-js"><span class="token comment" spellcheck="true">// mutations.spec.js</span>
  166. <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">&apos;chai&apos;</span>
  167. <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">&apos;./store&apos;</span>
  168. <span class="token comment" spellcheck="true">// destructure assign `mutations`</span>
  169. <span class="token keyword">const</span> <span class="token punctuation">{</span> increment <span class="token punctuation">}</span> <span class="token operator">=</span> mutations
  170. <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">&apos;mutations&apos;</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">&gt;</span> <span class="token punctuation">{</span>
  171. <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">&apos;INCREMENT&apos;</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">&gt;</span> <span class="token punctuation">{</span>
  172. <span class="token comment" spellcheck="true">// mock state</span>
  173. <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>
  174. <span class="token comment" spellcheck="true">// apply mutation</span>
  175. <span class="token function">increment</span><span class="token punctuation">(</span>state<span class="token punctuation">)</span>
  176. <span class="token comment" spellcheck="true">// assert result</span>
  177. <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>
  178. <span class="token punctuation">}</span><span class="token punctuation">)</span>
  179. <span class="token punctuation">}</span><span class="token punctuation">)</span>
  180. </code></pre>
  181. <h3 id="testing-actions">Testing Actions</h3>
  182. <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>
  183. <p>Example testing an async action:</p>
  184. <pre class="language-"><code class="lang-js"><span class="token comment" spellcheck="true">// actions.js</span>
  185. <span class="token keyword">import</span> shop <span class="token keyword">from</span> <span class="token string">&apos;../api/shop&apos;</span>
  186. <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">&gt;</span> <span class="token punctuation">{</span>
  187. <span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">&apos;REQUEST_PRODUCTS&apos;</span><span class="token punctuation">)</span>
  188. 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">&gt;</span> <span class="token punctuation">{</span>
  189. <span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">&apos;RECEIVE_PRODUCTS&apos;</span><span class="token punctuation">,</span> products<span class="token punctuation">)</span>
  190. <span class="token punctuation">}</span><span class="token punctuation">)</span>
  191. <span class="token punctuation">}</span>
  192. </code></pre>
  193. <pre class="language-"><code class="lang-js"><span class="token comment" spellcheck="true">// actions.spec.js</span>
  194. <span class="token comment" spellcheck="true">// use require syntax for inline loaders.</span>
  195. <span class="token comment" spellcheck="true">// with inject-loader, this returns a module factory</span>
  196. <span class="token comment" spellcheck="true">// that allows us to inject mocked dependencies.</span>
  197. <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">&apos;chai&apos;</span>
  198. <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">&apos;inject-loader!./actions&apos;</span><span class="token punctuation">)</span>
  199. <span class="token comment" spellcheck="true">// create the module with our mocks</span>
  200. <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>
  201. <span class="token string">&apos;../api/shop&apos;</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
  202. getProducts <span class="token punctuation">(</span>cb<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  203. <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">&gt;</span> <span class="token punctuation">{</span>
  204. <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>
  205. <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span>
  206. <span class="token punctuation">}</span>
  207. <span class="token punctuation">}</span>
  208. <span class="token punctuation">}</span><span class="token punctuation">)</span>
  209. <span class="token comment" spellcheck="true">// helper for testing action with expected mutations</span>
  210. <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">&gt;</span> <span class="token punctuation">{</span>
  211. <span class="token keyword">let</span> count <span class="token operator">=</span> <span class="token number">0</span>
  212. <span class="token comment" spellcheck="true">// mock commit</span>
  213. <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">&gt;</span> <span class="token punctuation">{</span>
  214. <span class="token keyword">const</span> mutation <span class="token operator">=</span> expectedMutations<span class="token punctuation">[</span>count<span class="token punctuation">]</span>
  215. <span class="token keyword">try</span> <span class="token punctuation">{</span>
  216. <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>
  217. <span class="token keyword">if</span> <span class="token punctuation">(</span>payload<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  218. <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>
  219. <span class="token punctuation">}</span>
  220. <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>
  221. <span class="token function">done</span><span class="token punctuation">(</span>error<span class="token punctuation">)</span>
  222. <span class="token punctuation">}</span>
  223. count<span class="token operator">++</span>
  224. <span class="token keyword">if</span> <span class="token punctuation">(</span>count <span class="token operator">&gt;=</span> expectedMutations<span class="token punctuation">.</span>length<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  225. <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
  226. <span class="token punctuation">}</span>
  227. <span class="token punctuation">}</span>
  228. <span class="token comment" spellcheck="true">// call the action with mocked store and arguments</span>
  229. <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>
  230. <span class="token comment" spellcheck="true">// check if no mutations should have been dispatched</span>
  231. <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>
  232. <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>
  233. <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
  234. <span class="token punctuation">}</span>
  235. <span class="token punctuation">}</span>
  236. <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">&apos;actions&apos;</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">&gt;</span> <span class="token punctuation">{</span>
  237. <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">&apos;getAllProducts&apos;</span><span class="token punctuation">,</span> done <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span>
  238. <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>
  239. <span class="token punctuation">{</span> type<span class="token punctuation">:</span> <span class="token string">&apos;REQUEST_PRODUCTS&apos;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
  240. <span class="token punctuation">{</span> type<span class="token punctuation">:</span> <span class="token string">&apos;RECEIVE_PRODUCTS&apos;</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>
  241. <span class="token punctuation">]</span><span class="token punctuation">,</span> done<span class="token punctuation">)</span>
  242. <span class="token punctuation">}</span><span class="token punctuation">)</span>
  243. <span class="token punctuation">}</span><span class="token punctuation">)</span>
  244. </code></pre>
  245. <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>
  246. <pre class="language-"><code class="lang-js"><span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">&apos;actions&apos;</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">&gt;</span> <span class="token punctuation">{</span>
  247. <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">&apos;getAllProducts&apos;</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">&gt;</span> <span class="token punctuation">{</span>
  248. <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>
  249. <span class="token keyword">const</span> state <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
  250. 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>
  251. <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>
  252. <span class="token punctuation">[</span><span class="token string">&apos;REQUEST_PRODUCTS&apos;</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
  253. <span class="token punctuation">[</span><span class="token string">&apos;RECEIVE_PRODUCTS&apos;</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>
  254. <span class="token punctuation">]</span><span class="token punctuation">)</span>
  255. <span class="token punctuation">}</span><span class="token punctuation">)</span>
  256. <span class="token punctuation">}</span><span class="token punctuation">)</span>
  257. </code></pre>
  258. <h3 id="testing-getters">Testing Getters</h3>
  259. <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>
  260. <p>Example testing a getter:</p>
  261. <pre class="language-"><code class="lang-js"><span class="token comment" spellcheck="true">// getters.js</span>
  262. <span class="token keyword">export</span> <span class="token keyword">const</span> getters <span class="token operator">=</span> <span class="token punctuation">{</span>
  263. 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>
  264. <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">&gt;</span> <span class="token punctuation">{</span>
  265. <span class="token keyword">return</span> product<span class="token punctuation">.</span>category <span class="token operator">===</span> filterCategory
  266. <span class="token punctuation">}</span><span class="token punctuation">)</span>
  267. <span class="token punctuation">}</span>
  268. <span class="token punctuation">}</span>
  269. </code></pre>
  270. <pre class="language-"><code class="lang-js"><span class="token comment" spellcheck="true">// getters.spec.js</span>
  271. <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">&apos;chai&apos;</span>
  272. <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">&apos;./getters&apos;</span>
  273. <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">&apos;getters&apos;</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">&gt;</span> <span class="token punctuation">{</span>
  274. <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">&apos;filteredProducts&apos;</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">&gt;</span> <span class="token punctuation">{</span>
  275. <span class="token comment" spellcheck="true">// mock state</span>
  276. <span class="token keyword">const</span> state <span class="token operator">=</span> <span class="token punctuation">{</span>
  277. products<span class="token punctuation">:</span> <span class="token punctuation">[</span>
  278. <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">&apos;Apple&apos;</span><span class="token punctuation">,</span> category<span class="token punctuation">:</span> <span class="token string">&apos;fruit&apos;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
  279. <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">&apos;Orange&apos;</span><span class="token punctuation">,</span> category<span class="token punctuation">:</span> <span class="token string">&apos;fruit&apos;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
  280. <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">&apos;Carrot&apos;</span><span class="token punctuation">,</span> category<span class="token punctuation">:</span> <span class="token string">&apos;vegetable&apos;</span> <span class="token punctuation">}</span>
  281. <span class="token punctuation">]</span>
  282. <span class="token punctuation">}</span>
  283. <span class="token comment" spellcheck="true">// mock getter</span>
  284. <span class="token keyword">const</span> filterCategory <span class="token operator">=</span> <span class="token string">&apos;fruit&apos;</span>
  285. <span class="token comment" spellcheck="true">// get the result from the getter</span>
  286. <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>
  287. <span class="token comment" spellcheck="true">// assert the result</span>
  288. <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>
  289. <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">&apos;Apple&apos;</span><span class="token punctuation">,</span> category<span class="token punctuation">:</span> <span class="token string">&apos;fruit&apos;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
  290. <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">&apos;Orange&apos;</span><span class="token punctuation">,</span> category<span class="token punctuation">:</span> <span class="token string">&apos;fruit&apos;</span> <span class="token punctuation">}</span>
  291. <span class="token punctuation">]</span><span class="token punctuation">)</span>
  292. <span class="token punctuation">}</span><span class="token punctuation">)</span>
  293. <span class="token punctuation">}</span><span class="token punctuation">)</span>
  294. </code></pre>
  295. <h3 id="running-tests">Running Tests</h3>
  296. <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>
  297. <h4 id="running-in-node">Running in Node</h4>
  298. <p>Create the following webpack config (together with proper <a href="https://babeljs.io/docs/usage/babelrc/" target="_blank"><code>.babelrc</code></a>):</p>
  299. <pre class="language-"><code class="lang-js"><span class="token comment" spellcheck="true">// webpack.config.js</span>
  300. module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span>
  301. entry<span class="token punctuation">:</span> <span class="token string">&apos;./test.js&apos;</span><span class="token punctuation">,</span>
  302. output<span class="token punctuation">:</span> <span class="token punctuation">{</span>
  303. path<span class="token punctuation">:</span> __dirname<span class="token punctuation">,</span>
  304. filename<span class="token punctuation">:</span> <span class="token string">&apos;test-bundle.js&apos;</span>
  305. <span class="token punctuation">}</span><span class="token punctuation">,</span>
  306. module<span class="token punctuation">:</span> <span class="token punctuation">{</span>
  307. loaders<span class="token punctuation">:</span> <span class="token punctuation">[</span>
  308. <span class="token punctuation">{</span>
  309. test<span class="token punctuation">:</span> <span class="token regex">/\.js$/</span><span class="token punctuation">,</span>
  310. loader<span class="token punctuation">:</span> <span class="token string">&apos;babel-loader&apos;</span><span class="token punctuation">,</span>
  311. exclude<span class="token punctuation">:</span> <span class="token regex">/node_modules/</span>
  312. <span class="token punctuation">}</span>
  313. <span class="token punctuation">]</span>
  314. <span class="token punctuation">}</span>
  315. <span class="token punctuation">}</span>
  316. </code></pre>
  317. <p>Then:</p>
  318. <pre class="language-"><code class="lang-bash">webpack
  319. mocha test-bundle.js
  320. </code></pre>
  321. <h4 id="running-in-browser">Running in Browser</h4>
  322. <ol>
  323. <li>Install <code>mocha-loader</code>.</li>
  324. <li>Change the <code>entry</code> from the webpack config above to <code>&apos;mocha-loader!babel-loader!./test.js&apos;</code>.</li>
  325. <li>Start <code>webpack-dev-server</code> using the config.</li>
  326. <li>Go to <code>localhost:8080/webpack-dev-server/test-bundle</code>.</li>
  327. </ol>
  328. <h4 id="running-in-browser-with-karma--karma-webpack">Running in Browser with Karma + karma-webpack</h4>
  329. <p>Consult the setup in <a href="https://vue-loader.vuejs.org/en/workflow/testing.html" target="_blank">vue-loader documentation</a>.</p>
  330. </section>
  331. </div>
  332. <div class="search-results">
  333. <div class="has-results">
  334. <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
  335. <ul class="search-results-list"></ul>
  336. </div>
  337. <div class="no-results">
  338. <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
  339. </div>
  340. </div>
  341. </div>
  342. </div>
  343. </div>
  344. <script src="//m.servedby-buysellads.com/monetization.js" type="text/javascript"></script>
  345. <div class="bsa-cpc"></div>
  346. <script>
  347. (function(){
  348. if(typeof _bsa !== 'undefined' && _bsa) {
  349. _bsa.init('default', 'CKYD62QM', 'placement:vuejsorg', {
  350. target: '.bsa-cpc',
  351. align: 'horizontal',
  352. disable_css: 'true'
  353. });
  354. }
  355. })();
  356. </script>
  357. </div>
  358. <a href="forms.html" class="navigation navigation-prev " aria-label="Previous page: Form Handling">
  359. <i class="fa fa-angle-left"></i>
  360. </a>
  361. <a href="hot-reload.html" class="navigation navigation-next " aria-label="Next page: Hot Reloading">
  362. <i class="fa fa-angle-right"></i>
  363. </a>
  364. </div>
  365. <script>
  366. var gitbook = gitbook || [];
  367. gitbook.push(function() {
  368. 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"}});
  369. });
  370. </script>
  371. </div>
  372. <script src="../gitbook/gitbook.js"></script>
  373. <script src="../gitbook/theme.js"></script>
  374. <script src="../gitbook/gitbook-plugin-edit-link/plugin.js"></script>
  375. <script src="../gitbook/gitbook-plugin-github/plugin.js"></script>
  376. <script src="../gitbook/gitbook-plugin-search/search-engine.js"></script>
  377. <script src="../gitbook/gitbook-plugin-search/search.js"></script>
  378. <script src="../gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
  379. <script src="../gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
  380. <script src="../gitbook/gitbook-plugin-sharing/buttons.js"></script>
  381. </body>
  382. </html>