{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/1","result":{"data":{"markdownRemark":{"id":"ea8a48aa-236d-5b82-9109-31a36424bf86","html":"<p>회사의 기술 스택이 Django, Jquery, Angular 에서 Node, Graphql, React 로 바뀌고 있다.</p>\n<p>리팩토링이 한 단계씩 진행되고 있는데, 이번에 처음으로 테스트 코드 작성에 참여했다.</p>\n<h2 id=\"jest\"><a href=\"#jest\" aria-label=\"jest 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><strong>Jest</strong></h2>\n<p>테스트 코드 작성을 용이하게 도와주는 자바스크립트용 프레임워크다.</p>\n<blockquote>\n<p>Jest is a delightful JavaScript Testing Framework with a focus on simplicity.</p>\n</blockquote>\n<p>공식 홈페이지 : <a href=\"https://jestjs.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://jestjs.io/</a></p>\n<p>사용했던 코드를 간단히 살펴보면</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ExamService'</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  <span class=\"token keyword\">let</span> user<span class=\"token punctuation\">:</span> User <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span>\n\n  <span class=\"token function\">beforeAll</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    user <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">createUser</span><span class=\"token punctuation\">(</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\">'getExam'</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    <span class=\"token function\">test</span><span class=\"token punctuation\">(</span><span class=\"token string\">'returns Exam instance'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> contentService<span class=\"token punctuation\">,</span> examService <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">createServices</span><span class=\"token punctuation\">(</span>sequelize<span class=\"token punctuation\">,</span> user<span class=\"token punctuation\">)</span>\n\n      <span class=\"token keyword\">const</span> company <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">createCompany</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">const</span> exam <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">createExamModel</span><span class=\"token punctuation\">(</span>contentService<span class=\"token punctuation\">,</span> company<span class=\"token punctuation\">)</span>\n\n      <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> examService<span class=\"token punctuation\">.</span><span class=\"token function\">getExam</span><span class=\"token punctuation\">(</span>exam<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">)</span>\n      <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toMatchObject</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> id<span class=\"token punctuation\">:</span> exam<span class=\"token punctuation\">.</span>id <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<ul>\n<li><code class=\"language-text\">describe</code> creates a block that groups together several related tests</li>\n<li><code class=\"language-text\">test</code> method which runs a test</li>\n<li><code class=\"language-text\">beforeAll</code> runs a function before any of the tests in this file run.</li>\n<li><code class=\"language-text\">afterAll</code> runs a function after all the tests in this file have completed.</li>\n<li><code class=\"language-text\">expect</code> function is used every time you want to test a value</li>\n</ul>\n<p>위 기본적인 함수들만 잘 활용하여도 테스트 코드를 용이하게 짤 수 있었다.</p>\n<p>BUT,</p>\n<p>에러를 잡는 test 코드는 약간의 애를 먹었다.</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'buildWhereOptionsFromFiltersForExamQuestion'</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  <span class=\"token function\">test</span><span class=\"token punctuation\">(</span><span class=\"token string\">'throw when examID is invalid'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    expect<span class=\"token punctuation\">.</span><span class=\"token function\">assertions</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">const</span> userModel <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">createSuperUser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> examService <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">createServices</span><span class=\"token punctuation\">(</span>sequelize<span class=\"token punctuation\">,</span> userModel<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">await</span> examService<span class=\"token punctuation\">.</span><span class=\"token function\">buildWhereOptionsFromFiltersForExamQuestion</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> examID<span class=\"token punctuation\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">UserInputError</span><span class=\"token punctuation\">(</span><span class=\"token string\">'invalid examID'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>jest 공식문서를 뒤져서 에러를 잡을 수 있는 방법 두 가지를 찾았다.</p>\n<ol>\n<li>\n<p><code class=\"language-text\">.toThrow(error?)</code> 함수</p>\n<blockquote>\n<p><a href=\"https://jestjs.io/docs/en/expect#tothrowerror\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://jestjs.io/docs/en/expect#tothrowerror</a></p>\n</blockquote>\n</li>\n<li>\n<p>try/catch 혹은 <code class=\"language-text\">.rejects</code> 함수를 활용한 error handling</p>\n<blockquote>\n<p><a href=\"https://jestjs.io/docs/en/tutorial-async#error-handling\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://jestjs.io/docs/en/tutorial-async#error-handling</a></p>\n</blockquote>\n</li>\n</ol>\n<p>두 가지 방법 모두 시도해본 결과,\n무슨 이유인지 정확히 파악하지 못했지만 첫 번째 방법이 작동하지 않아 두 번째 방법으로 해결했다.</p>\n<h2 id=\"당면했던-문제들\"><a href=\"#%EB%8B%B9%EB%A9%B4%ED%96%88%EB%8D%98-%EB%AC%B8%EC%A0%9C%EB%93%A4\" aria-label=\"당면했던 문제들 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><strong>당면했던 문제들</strong></h2>\n<h3 id=\"1-sequelizeuniqueconstrainterror-validation-error\"><a href=\"#1-sequelizeuniqueconstrainterror-validation-error\" aria-label=\"1 sequelizeuniqueconstrainterror validation error 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>1. SequelizeUniqueConstraintError: Validation error</h3>\n<p>이 문제는 Jest와 관련된 문제는 아니였다.\nmigration 파일에 정의된 unique한 컬럼이 있었는데, 테스트 코드 중 이 유니크한 컬럼 값으로 다른 row에 이미 할당된 값을 주어 발생한 에러였다.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\">  content_id<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">type</span><span class=\"token punctuation\">:</span> DataTypes<span class=\"token punctuation\">.</span><span class=\"token constant\">INTEGER</span><span class=\"token punctuation\">,</span>\n    unique<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n    allowNull<span class=\"token punctuation\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span></code></pre></div>\n<p>Django 에선 models.py 에 정의된 바에 따라 migration 파일이 생성되었다 보니,\nmigration 파일을 따로 살펴볼 필요없이 작업하고 있는 해당 모델의 models.py 만 살펴봤었다.</p>\n<p>때문에 이번 작업시에도 모델이 정의된 파일만 살펴보며 작업하다가 발생한 문제였다.</p>\n<p>node 에선 아직 정확히는 모르겠지만, models 디렉토리에 정의해 둔 모델 정보와\nmigrations 디렉토리에 정의된 migration 정보가 일치하지 않을 수 있다.\n그 이유는 <code class=\"language-text\">python manage.py makemigrations</code> 명령어로 migration 파일을 자동 생성하는 Django와 달리 node의 이 migration 파일은 다른 팀원이 직접 만든 코드라고 한다.</p>\n<p>앞으로 작업 시, migration 파일에 정의된 테이블 정보도 함께 보며 작업해야 함을 배웠다.</p>\n<h3 id=\"2-jest-encountered-an-unexpected-token\"><a href=\"#2-jest-encountered-an-unexpected-token\" aria-label=\"2 jest encountered an unexpected token 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>2. Jest encountered an unexpected token</h3>\n<blockquote>\n<p>Here’s what you can do:</p>\n<ul>\n<li>To have some of your “node_modules” files transformed, you can specify a custom “transformIgnorePatterns” in your config.</li>\n<li>If you need a custom transformation specify a “transform” option in your config.</li>\n<li>If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the “moduleNameMapper” config option.</li>\n</ul>\n</blockquote>\n<blockquote>\n<p>You’ll find more details and examples of these config options in the docs: <a href=\"https://jestjs.io/docs/en/configuration.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://jestjs.io/docs/en/configuration.html</a></p>\n</blockquote>\n<p>위와 같이 안내된 에러 로그를 보고, jest 관련 설정 문제라고 판단했다.</p>\n<p>jest 공식 문서를 보고 처음부터 설정을 다시 해봤지만.. 실패..\n<code class=\"language-text\">Jest encountered an unexpected token</code> 에러에 대한 구글링으로 jest.config.js 수정 및 관련 세팅 변경의 반복.. 거듭되는 실패..</p>\n<p>이 에러는 사실 로컬 환경에서는 발생하지 않았다.\nGithub에 PR을 보내면 자동으로 실행되는 Node CI 에서 발생했다.\n우리는 Node CI로 node 10 버젼과 12 버젼의 빌드 테스트를 하고 있다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 672px;\"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/842c284a0bed9e0f9a06b3349859d7aa/f0536/nodeCI.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 69.64285714285714%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAABqUlEQVQ4y52TzW7TQBRGZwFlDQt2dEE3LHgtYIXEAgQS4mlgg8SLlJK2gGwSJ3HioDQ0ierE9c/YHvswY+MIg9QarnR0Z+5882muPSNKYLCwCF2Xf42yLHe5QSxzn7f99/jvPjDzZlh9h5E7ZaxxJx62nk90PbgMmX2fszhfchlGpGnaMm1CKEqs+RcCZ0iWK6IoJo4TEimRMiVJZFVTSmmTTGvyaqxU0TrZ7oSUV7XUbs/Mf99cFMVfiDTL8LdbgiDA9zesVmud/VZLf7Z1VYgolmyCkPliWX2vw6Men7/aXGhzE0qVqKI7omWvJHkSIqMt/xvieBpz4sV8mkR8dGsODeM6m7pZP/Zq3XWIW08sbj6yuP30G/eeD9jXHLxyOHjpcF9zR9f3HlsYXRe0oc2NyrDP/oshD14PefhmtMt3n/X1uo3R7XVAeCvJbC0ZLyPss4BTL6Kn2zxyQ3rTCGeRVOtG562vR99DZS4HMg+5iH1GPySDs1gbJEzOEzZhZv4Wla4DIpEZBpnmpJl5AXlFntekut5ouiDMczOkZnNWm8pfuaHRdOEnGQr89F8JEqwAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n        <source\n          srcset=\"/static/842c284a0bed9e0f9a06b3349859d7aa/01472/nodeCI.webp 240w,\n/static/842c284a0bed9e0f9a06b3349859d7aa/222bd/nodeCI.webp 480w,\n/static/842c284a0bed9e0f9a06b3349859d7aa/be742/nodeCI.webp 672w\"\n          sizes=\"(max-width: 672px) 100vw, 672px\"\n          type=\"image/webp\"\n        />\n        <source\n          srcset=\"/static/842c284a0bed9e0f9a06b3349859d7aa/0783d/nodeCI.png 240w,\n/static/842c284a0bed9e0f9a06b3349859d7aa/782f4/nodeCI.png 480w,\n/static/842c284a0bed9e0f9a06b3349859d7aa/f0536/nodeCI.png 672w\"\n          sizes=\"(max-width: 672px) 100vw, 672px\"\n          type=\"image/png\"\n        />\n        <img\n          class=\"gatsby-resp-image-image\"\n          src=\"/static/842c284a0bed9e0f9a06b3349859d7aa/f0536/nodeCI.png\"\n          alt=\"nodeCI\"\n          title=\"nodeCI\"\n          loading=\"lazy\"\n        />\n      </picture>\n  </a>\n    </span></p>\n<p>로컬에서는 문제 없었기에 PR을 보냈는데,\n노드 10 버젼에서만 에러가 발생해 의문이 생겼다.\n팀원에게 물어보니, 로컬환경이 노드 12 버젼이라 그렇단다.</p>\n<p>설정 문제가 아닐 수도 있겠다는 생각이 들었고,</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\">cookie <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">_cookie<span class=\"token punctuation\">.</span>CookieImpl</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n             <span class=\"token operator\">^</span>\n    SyntaxError<span class=\"token punctuation\">:</span> Unexpected token <span class=\"token operator\">=</span></code></pre></div>\n<p>팀원이 에러가 발생했던 코드를 보고, 코드 문제일 수도 있다고 하며 해당 부분을 수정해주니 에러가 해결됐다.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\">@lazy <span class=\"token keyword\">public</span> <span class=\"token keyword\">get</span> <span class=\"token function\">cookie</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span> Cookie <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CookieImpl</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>위 코드가 수정된 코드이다.\n이 문제가 발생했을 때, 코드엔 빨간 줄이 뜨지 않아 코드에 이상이 있을 꺼라고 접근하지 않았다.</p>\n<p>아직 자바스크립트 기본기가 미숙하고, 리팩토링 프로젝트의 코드를 제대로 이해하지 못한 탓이다.\n공부하자.</p>\n<h2 id=\"전-체-회-고\"><a href=\"#%EC%A0%84-%EC%B2%B4-%ED%9A%8C-%EA%B3%A0\" aria-label=\"전 체 회 고 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><strong>전 체 회 고</strong></h2>\n<p>테스트 코드는 비즈니스 로직을 테스트하기 위한 코드이다.\n테스트 코드를 작성하다 잘못된 비즈니스 로직을 발견하면 이는 수정해야 한다.\n하지만, 테스트 케이스를 위한 비즈니스 로직의 수정이 아닌지 생각해봐야 한다.</p>","fields":{"slug":"/posts/1","tagSlugs":["/tag/jest/"]},"frontmatter":{"date":"2019-11-04","description":"","tags":["Jest"],"title":"테스트 코드 작성기 (Jest 사용)"}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/posts/1"}}}