{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/20-10-17-cypress-helper/",
    "result": {"data":{"site":{"siteMetadata":{"title":"irrationnelle","author":"irrationnelle","siteUrl":"https://dev.rase.blog","comment":{"disqusShortName":"","utterances":"irrationnelle/devlog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"50d8c91a-56cb-5492-a526-d5e317669b0f","excerpt":"테스트 코드 역시 중복을 제거하여 가독성을 살리고 유지보수를 용이하게 해주는 것이 중요하다. 사실 테스트 코드는 작성하지 않아도 월급을 주지 않거나 잘리는 일은 없기 때문에 소홀히 하는 경향이 더 강하기 때문에 오히려 더더욱 접근성이 높여줄 필요가 있다. Cypress 에서 자주 사용하는 selector 가 있거나 일반적으로 적용하는 timeout 옵션이 있다면 매번 일일히 작성하는 것보다 helper 함수로 추출하는 것이 좋다. 하지만 Cypress…","html":"<p>테스트 코드 역시 중복을 제거하여 가독성을 살리고 유지보수를 용이하게 해주는 것이 중요하다.</p>\n<p>사실 테스트 코드는 작성하지 않아도 월급을 주지 않거나 잘리는 일은 없기 때문에 소홀히 하는 경향이 더 강하기 때문에 오히려 더더욱 접근성이 높여줄 필요가 있다.</p>\n<p>Cypress 에서 자주 사용하는 selector 가 있거나 일반적으로 적용하는 timeout 옵션이 있다면 매번 일일히 작성하는 것보다 helper 함수로 추출하는 것이 좋다.</p>\n<p>하지만 Cypress 메소드는 <code class=\"language-text\">cy</code> 네임스페이스가 적용되는 공간에서 사용할 수 있기 때문에 일반적인 방법으로 helper 함수를 만드는 것이 어렵다.</p>\n<p>따라서 Cypress 가 제공하는 <code class=\"language-text\">Cypress.Commands.add()</code> 메소드를 사용할 필요가 있다. 이 메소드는 <code class=\"language-text\">root/Cypress/support/index.ts</code> 에 작성한다.</p>\n<p>첫번째 인자로 helper 함수의 이름을 string 으로 전달하고, 두번째 인자로 helper 함수의 오퍼레이션 역할을 하는 함수를 callback 으로 전달한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\">Cypress<span class=\"token punctuation\">.</span>Commands<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>‘getByTestId’<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>testid<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> timeout <span class=\"token operator\">=</span> <span class=\"token number\">10000</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n  cy<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">[data-testid=</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>testid<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">]</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> timeout <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>위 helper 함수는 html element 에 선언한 <code class=\"language-text\">data-testid</code> attribute 로 해당 element 에 접근하는 역할을 한다. 사용자와의 상호작용이 많은 서비스의 경우 특정 액션 이후에 해당 element 가 나타날 수 있기 때문에 기본적으로 timeout 옵션값으로 <code class=\"language-text\">10000ms</code> 를 전달한다.</p>\n<p>자바스크립트 환경에서는 여기서 끝이지만 타입스크립트에서는 타입 선언이 필요하다.</p>\n<p>따라서 <code class=\"language-text\">root/Cypress/support/index.d.ts</code> 에 다음과 같이 타입을 지정한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">/// &lt;reference types=\"cypress\" /></span>\n<span class=\"token keyword\">declare</span> <span class=\"token keyword\">namespace</span> Cypress <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Chainable<span class=\"token operator\">&lt;</span>Subject<span class=\"token operator\">></span></span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token function\">getByTestId</span><span class=\"token punctuation\">(</span>testid<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> timeout<span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Chainable<span class=\"token operator\">&lt;</span>JQuery<span class=\"token operator\">&lt;</span>HTMLElement<span class=\"token operator\">>></span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>그리고 사소한 부분이라 빼먹기 쉬운데 이렇게 만든 helper 함수를 사용할 테스트 파일에 다음 <code class=\"language-text\">/// &lt;reference types=“../support” /></code> 를 상단에 삽입한다. 예시처럼 삽입하면 될 것이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">/// &lt;reference types=“cypress” /></span>\n<span class=\"token comment\">/// &lt;reference types=“../support” /></span></code></pre></div>\n<p>그럼 이제 테스트 코드(<code class=\"language-text\">root/Cypress/integration/example-test.spec.ts</code>)에서 다음처럼 사용이 가능하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\">  cy<span class=\"token punctuation\">.</span><span class=\"token function\">getByTestId</span><span class=\"token punctuation\">(</span><span class=\"token string\">'example-button'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">click</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  cy<span class=\"token punctuation\">.</span><span class=\"token function\">getByTestId</span><span class=\"token punctuation\">(</span><span class=\"token string\">'exmaple-content'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">should</span><span class=\"token punctuation\">(</span><span class=\"token string\">'be.visible'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>","frontmatter":{"title":"Typescript 환경에서 Cypress helper 함수 만들기","date":"October 17, 2020"}}},"pageContext":{"slug":"/20-10-17-cypress-helper/","previous":{"fields":{"slug":"/20-10-06-destructuring-assignment/"},"frontmatter":{"title":"비구조화 할당은 얕은 복사","category":"Dev","draft":false}},"next":{"fields":{"slug":"/20-10-18-record-type-on-typescript/"},"frontmatter":{"title":"Typecript 의 Record 타입","category":"typescript","draft":false}}}},
    "staticQueryHashes": ["3128451518","3474900066"]}