{"data":{"content":{"fields":{"slug":"/labs/your-first-react-component","type":"lab"},"frontmatter":{"title":"Your First React Component"},"html":"<h1>Lab Two - Your First React Component</h1>\n<h2>Switch to Lab02</h2>\n<ul>\n<li>In a terminal:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">cd ../ # presuming still in previous lab\ncd lab-02\nyarn start</code></pre></div>\n<h2>What are we trying to do?</h2>\n<p>The first thing we need in our Timesheet application is a listing of all the projects that an employee can be working on. We want a table with one row for each Project.</p>\n<p>Many times in React it’s helpful to build things starting at the bottom and building your way upwards - we’re going to do this here by building a row, then a table, then a container.</p>\n<h2>Create a component that will render a Project row</h2>\n<ul>\n<li>\n<p>Open <strong>src/projects/ProjectRow.js</strong></p>\n</li>\n<li>\n<p>This is going to be the component that will render a single row in our table using data from a Project</p>\n</li>\n<li>\n<p>The first thing we want to do is <code class=\"language-text\">import</code> the libraries we need. At the top of the page add:</p>\n</li>\n</ul>\n<div class=\"gatsby-code-title\">src/projects/ProjectRow.js</div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> PropTypes <span class=\"token keyword\">from</span> <span class=\"token string\">'prop-types'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>\n<p>This imports the React library so we can create React logic, and the PropTypes library so we can define the types of properties our React logic expects.</p>\n</li>\n<li>\n<p>Next let’s create our empty <strong>React</strong> component class and have the module <code class=\"language-text\">export</code> the class:</p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">ProjectRow</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  \n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> ProjectRow<span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>\n<p>Now we have to tell <strong>React</strong> what we want the component to draw to the page.</p>\n</li>\n<li>\n<p>To do this we need to implement a <code class=\"language-text\">render()</code> method:</p>\n</li>\n<li>\n<p>Inside the <code class=\"language-text\">class</code>, add the below method:</p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> project <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>tr<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>td<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>project<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>td<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>td<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>project<span class=\"token punctuation\">.</span>description<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>td<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>tr<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>\n<p>Let’s look at what we just did:</p>\n<ul>\n<li>We’ve grabbed a ‘project’ prop that we presume will be supplied to this component from a parent</li>\n<li>We’ve supplied a <code class=\"language-text\">JSX</code> template that builds an HTML table row along with a couple table cells</li>\n<li>The first cell is going to display the ‘name’ value off the project</li>\n<li>The second cell is going to display the ‘description’ value off the project</li>\n</ul>\n</li>\n<li>\n<p>Next we declare that this component expects a single prop named ‘project’. Add this just above the default export:</p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">ProjectRow<span class=\"token punctuation\">.</span>propTypes <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  project<span class=\"token punctuation\">:</span> PropTypes<span class=\"token punctuation\">.</span>object<span class=\"token punctuation\">.</span>isRequired\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<details>\n  <summary>When complete, click here to see what the entire module should look like:</summary>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> PropTypes <span class=\"token keyword\">from</span> <span class=\"token string\">'prop-types'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">ProjectRow</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> project <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>tr<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>td<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>project<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>td<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>td<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>project<span class=\"token punctuation\">.</span>description<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>td<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>tr<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\nProjectRow<span class=\"token punctuation\">.</span>propTypes <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  project<span class=\"token punctuation\">:</span> PropTypes<span class=\"token punctuation\">.</span>object<span class=\"token punctuation\">.</span>isRequired\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> ProjectRow<span class=\"token punctuation\">;</span></code></pre></div>\n</details>\n<p> </p>\n<h2>Create a table component</h2>\n<ul>\n<li>\n<p>We have a row, but now we need a way to turn a list of projects into a table full of <code class=\"language-text\">ProjectRow</code> components</p>\n</li>\n<li>\n<p>Open <strong>src/projects/ProjectTable.js</strong></p>\n</li>\n<li>\n<p>Add the necessary imports:</p>\n</li>\n</ul>\n<div class=\"gatsby-code-title\">src/projects/ProjectTable.js</div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> PropTypes <span class=\"token keyword\">from</span> <span class=\"token string\">'prop-types'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Table <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> ProjectRow <span class=\"token keyword\">from</span> <span class=\"token string\">'./ProjectRow'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>\n<p>You’ll notice we’re pulling in two new imports:</p>\n<ul>\n<li>We’re going to use a <code class=\"language-text\">Table</code> component from a third-party library called <code class=\"language-text\">react-bootstrap</code> - this is just to make things look pretty</li>\n<li>We’re going to use our <code class=\"language-text\">ProjectRow</code> component for each Project we want to render in our table</li>\n</ul>\n</li>\n<li>\n<p>Declare our base class and export</p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">ProjectTable</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> ProjectTable<span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Then build a render method to construct a table from a list of projects:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> projects <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>Table bordered striped<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>thead<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>tr<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>th<span class=\"token operator\">></span>Name<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>th<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>th<span class=\"token operator\">></span>Description<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>th<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>tr<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>thead<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>tbody<span class=\"token operator\">></span>\n        <span class=\"token punctuation\">{</span>projects<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>project <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n          <span class=\"token operator\">&lt;</span>ProjectRow project<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span> project <span class=\"token punctuation\">}</span> key<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span> project<span class=\"token punctuation\">.</span>_id <span class=\"token punctuation\">}</span><span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>tbody<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Table<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>\n<p>Whoa! This is <em>way</em> more complicated than the last one! What’s going on here?</p>\n<ul>\n<li>We grab a list of projects that we presume will be supplied as a prop</li>\n<li>We build a <code class=\"language-text\">Table</code> and set some props to enable some Bootstrap-supplied styling (‘bordered’ adds a border, ‘striped’ causes alternating rows to be different colors)</li>\n<li>We give that table a header in which we define the column headings</li>\n<li>Inside the table body we then iterate over the list of projects and, for each, map a project to an instance of our <code class=\"language-text\">ProjectRow</code> component. We pass the project down as a prop.\n<strong>Note:</strong> We’re also giving React an ‘index’ in the form of <code class=\"language-text\">key</code> so it can efficiently render the list of items</li>\n</ul>\n</li>\n<li>\n<p>Finally, add our prop declarations:</p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">ProjectTable<span class=\"token punctuation\">.</span>defaultProps <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  projects<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\nProjectTable<span class=\"token punctuation\">.</span>propTypes <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  projects<span class=\"token punctuation\">:</span> PropTypes<span class=\"token punctuation\">.</span>array\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<details>\n  <summary>When complete, click here to see what the entire module should look like:</summary>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> PropTypes <span class=\"token keyword\">from</span> <span class=\"token string\">'prop-types'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Table <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> ProjectRow <span class=\"token keyword\">from</span> <span class=\"token string\">'./ProjectRow'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">ProjectTable</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> projects <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Table bordered striped<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>thead<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>tr<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>th<span class=\"token operator\">></span>Name<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>th<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>th<span class=\"token operator\">></span>Description<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>th<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>tr<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>thead<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>tbody<span class=\"token operator\">></span>\n          <span class=\"token punctuation\">{</span>projects<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>project <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n            <span class=\"token operator\">&lt;</span>ProjectRow project<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span> project <span class=\"token punctuation\">}</span> key<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span> project<span class=\"token punctuation\">.</span>_id <span class=\"token punctuation\">}</span><span class=\"token operator\">/</span><span class=\"token operator\">></span>\n          <span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>tbody<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Table<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\nProjectTable<span class=\"token punctuation\">.</span>defaultProps <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  projects<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\nProjectTable<span class=\"token punctuation\">.</span>propTypes <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  projects<span class=\"token punctuation\">:</span> PropTypes<span class=\"token punctuation\">.</span>array<span class=\"token punctuation\">.</span>isRequired\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> ProjectTable<span class=\"token punctuation\">;</span></code></pre></div>\n</details>\n<p> </p>\n<h2>Create a component to manage the data</h2>\n<ul>\n<li>\n<p>Awesome! We have a component that will display a table full of project data. But where does the data come from?</p>\n</li>\n<li>\n<p>It’s typically best practice to separate out how you show your data (present) vs. manage your data (contain) - we’ll talk more about this when we get to Redux</p>\n</li>\n<li>\n<p>Let’s build a data container</p>\n</li>\n<li>\n<p>Open <strong>src/projects/Projects.js</strong></p>\n</li>\n<li>\n<p>This is going to be the component that will hold the Project data and pass it down into the table</p>\n</li>\n<li>\n<p>Add the necessary imports:</p>\n</li>\n</ul>\n<div class=\"gatsby-code-title\">src/projects/Projects.js</div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> ProjectTable <span class=\"token keyword\">from</span> <span class=\"token string\">'./ProjectTable'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>And build the base class</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Projects</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  \n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Projects<span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Now we need to give the component some data to render. A good holding place is the component’s <em>state</em>. We need to initialize state with the data in the state property. Add this property at the top of the class:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  projects<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n      _id<span class=\"token punctuation\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n      name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Project1'</span><span class=\"token punctuation\">,</span>\n      description<span class=\"token punctuation\">:</span> <span class=\"token string\">'This is your first project'</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>\n      _id<span class=\"token punctuation\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n      name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Project2'</span><span class=\"token punctuation\">,</span>\n      description<span class=\"token punctuation\">:</span> <span class=\"token string\">'This is your second project'</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>\n      _id<span class=\"token punctuation\">:</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span>\n      name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Project3'</span><span class=\"token punctuation\">,</span>\n      description<span class=\"token punctuation\">:</span> <span class=\"token string\">'This is the third project'</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Now we have to get that data into our table</li>\n<li>Add the render method:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> projects <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">;</span>\n  \n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>h1<span class=\"token operator\">></span>Projects<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h1<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>ProjectTable projects<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>projects<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span></code></pre></div>\n<details>\n  <summary>When complete, click here to see what the entire module should look like:</summary>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> ProjectTable <span class=\"token keyword\">from</span> <span class=\"token string\">'./ProjectTable'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Projects</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    projects<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token punctuation\">{</span>\n        _id<span class=\"token punctuation\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n        name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Project1'</span><span class=\"token punctuation\">,</span>\n        description<span class=\"token punctuation\">:</span> <span class=\"token string\">'This is your first project'</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">{</span>\n        _id<span class=\"token punctuation\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n        name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Project2'</span><span class=\"token punctuation\">,</span>\n        description<span class=\"token punctuation\">:</span> <span class=\"token string\">'This is your second project'</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">{</span> _id<span class=\"token punctuation\">:</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Project3'</span><span class=\"token punctuation\">,</span> description<span class=\"token punctuation\">:</span> <span class=\"token string\">'This is the third project'</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> projects <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>h1<span class=\"token operator\">></span>Projects<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h1<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>ProjectTable projects<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>projects<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Projects<span class=\"token punctuation\">;</span></code></pre></div>\n</details>\n<p> </p>\n<h2>Test our components</h2>\n<ul>\n<li>\n<p>Now that we’ve created our first components, we need to make sure they work as expected</p>\n</li>\n<li>\n<p>Open <strong>src/projects/ProjectRow.test.js</strong></p>\n</li>\n<li>\n<p>First, let’s import our libraries for <code class=\"language-text\">React</code> <code class=\"language-text\">ProjectRow</code> and the shallow <code class=\"language-text\">enzyme</code> renderer</p>\n</li>\n<li>\n<p>Then, let’s set up the test suite by adding a <code class=\"language-text\">describe</code> block:</p>\n</li>\n</ul>\n<div class=\"gatsby-code-title\">src/projects/ProjectRow.test.js</div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> shallow <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'enzyme'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> ProjectRow <span class=\"token keyword\">from</span> <span class=\"token string\">'./ProjectRow'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'&lt;ProjectRow />'</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 comment\">// Tests go here</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Now we need to set up our component that we’ll be testing. Inside the <code class=\"language-text\">describe</code> block:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">let</span> wrapper<span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">beforeEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> project <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    name<span class=\"token punctuation\">:</span> <span class=\"token string\">'NAME'</span><span class=\"token punctuation\">,</span>\n    description<span class=\"token punctuation\">:</span> <span class=\"token string\">'DESCRIPTION'</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  wrapper <span class=\"token operator\">=</span> <span class=\"token function\">shallow</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&lt;</span>ProjectRow project<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>project<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<blockquote>\n<p>What is happening here? We use the <a href=\"http://airbnb.io/enzyme/docs/api/shallow.html\">shallow renderer</a> from <a href=\"http://airbnb.io/enzyme/index.html\">Enzyme</a> to render the component into a in-memory sandboxed “document” so that we can perform inquiries. Notice that we are using <code class=\"language-text\">JSX</code> in the <code class=\"language-text\">shallow()</code> method. Shallow testing is useful to isolate our test by not rendering any child components. For more advanced “integration” style tests you would use <code class=\"language-text\">mount()</code> for <a href=\"http://airbnb.io/enzyme/docs/api/mount.html\">full DOM rendering</a></p>\n</blockquote>\n<ul>\n<li>The shallow render is going to be created before each test we define. This may seem inefficient (why not just create it once?), but shallow renders are very fast and starting with a blank slate before each test can be helpful once your tests get complicated.</li>\n<li>This is great, but we aren’t actually testing anything yet. Let’s add some tests below the <code class=\"language-text\">beforeEach</code> block:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should instantiate the Project Row Component'</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\">expect</span><span class=\"token punctuation\">(</span>wrapper<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveLength</span><span class=\"token punctuation\">(</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 punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should render values into expected cells'</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\">expect</span><span class=\"token punctuation\">(</span>wrapper<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token string\">'td'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveLength</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>wrapper<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token string\">'td'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">at</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">text</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\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token string\">'NAME'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>wrapper<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token string\">'td'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">at</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 function\">text</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\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token string\">'DESCRIPTION'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Our tests first verify that the ProjectRow component renders without blowing up (always a good test to have 😅), then tests that the expected values are rendered into the table cells</li>\n</ul>\n<p> </p>\n<details>\n  <summary>When finished, click here to see if your suite is similar to the one below:</summary>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> shallow <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'enzyme'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> ProjectRow <span class=\"token keyword\">from</span> <span class=\"token string\">'./ProjectRow'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'&lt;ProjectRow />'</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> wrapper<span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">beforeEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> project <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n      name<span class=\"token punctuation\">:</span> <span class=\"token string\">'NAME'</span><span class=\"token punctuation\">,</span>\n      description<span class=\"token punctuation\">:</span> <span class=\"token string\">'DESCRIPTION'</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    wrapper <span class=\"token operator\">=</span> <span class=\"token function\">shallow</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&lt;</span>ProjectRow project<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>project<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should instantiate the Project Row Component'</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\">expect</span><span class=\"token punctuation\">(</span>wrapper<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveLength</span><span class=\"token punctuation\">(</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 punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should render values into expected cells'</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\">expect</span><span class=\"token punctuation\">(</span>wrapper<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token string\">'td'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveLength</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>wrapper<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token string\">'td'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">at</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">text</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\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token string\">'NAME'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>wrapper<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token string\">'td'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">at</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 function\">text</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\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token string\">'DESCRIPTION'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</details>\n<p> </p>\n<ul>\n<li>Let’s write tests for ProjectTable. Open <strong>src/projects/ProjectTable.test.js</strong></li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> shallow <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'enzyme'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> ProjectTable <span class=\"token keyword\">from</span> <span class=\"token string\">'./ProjectTable'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> ProjectRow <span class=\"token keyword\">from</span> <span class=\"token string\">'./ProjectRow'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'&lt;ProjectTable />'</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> wrapper<span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">beforeEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> projects <span class=\"token operator\">=</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>\n    wrapper <span class=\"token operator\">=</span> <span class=\"token function\">shallow</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&lt;</span>ProjectTable projects<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>projects<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should instantiate the Project Table Component'</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\">expect</span><span class=\"token punctuation\">(</span>wrapper<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveLength</span><span class=\"token punctuation\">(</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 punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should render a row for each project'</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\">expect</span><span class=\"token punctuation\">(</span>wrapper<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span>ProjectRow<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveLength</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>\n<p>These tests shallow render ProjectTable with two stubbed project entries</p>\n<ul>\n<li>We verify that the table renders without blowing up</li>\n<li>Then make sure that we end up with two instances of the ProjectRow component being rendered (one for each project entry)</li>\n</ul>\n</li>\n<li>\n<p>Finally, add some tests for Projects. Open <strong>src/projects/Projects.test.js</strong></p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> shallow <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'enzyme'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> Projects <span class=\"token keyword\">from</span> <span class=\"token string\">'./Projects'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> ProjectTable <span class=\"token keyword\">from</span> <span class=\"token string\">'./ProjectTable'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'&lt;Projects />'</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> wrapper<span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">beforeEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    wrapper <span class=\"token operator\">=</span> <span class=\"token function\">shallow</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&lt;</span>Projects <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should instantiate the Project Component'</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\">expect</span><span class=\"token punctuation\">(</span>wrapper<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveLength</span><span class=\"token punctuation\">(</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 punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should pass projects down to table'</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    wrapper<span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      projects<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> <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>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>wrapper<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span>ProjectTable<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">prop</span><span class=\"token punctuation\">(</span><span class=\"token string\">'projects'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveLength</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>\n<p>Here, we’re shallow rendering the Projects container</p>\n<ul>\n<li>First we ensure it renders</li>\n<li>Then we use Enzyme to update the component’s state so that it has 4 project entries, then verify that the prop value passed down to ProjectTable reflects those 4 items</li>\n</ul>\n</li>\n</ul>\n<ul>\n<li>If it’s not already running, open your terminal and run the test (<code class=\"language-text\">yarn test</code>) command.</li>\n</ul>\n<p><span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 650px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 61.08742004264393%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsSAAALEgHS3X78AAABZUlEQVQoz5WR3VKCUBSFua6RRilvy38EAUF+BBVBMM1Rq7Garrro5XqAXq/O6gDioKOTXKzZi304395nb6ZwwxG2zKFQKJKLSxYlrhyrWLwGe1VClGNZDo2WBl4w0WobsXq6h45sx57mSXJm/jDu1wf8709iWBP4kxUeFi80LmEP7tHV3BjCC9YeLPJNXt/5JJ9AGW0eEH05hWH6pGu6kPojiKoNWRlAUpwdJL2cAg582iFhAn+N2fQZphmAN/oQ3n2I3ghh8AjXW9Cn9vYgWdixb2a22GCxeoUkO9CdCby3JxjjEPP5BkG4zs7pLDH0qVB7LjR9DK03hq55kCQHomRTmAOh088HtOwAlh1iMJzRmSVzk9Vh7BV1lL/DaFupsguI1Mws43AxJ4HnVM3VIf2ZbKuTww5zaMdIOyT/VW6L1knxorVlWGDqDYVU6xKo0ohqbRsz/q4i4rYiHBU9i+9WauLvH3mrcjNaVlQwAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    ></span>\n    <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;\"\n        alt=\"yarn test\"\n        title=\"\"\n        src=\"/static/3dd3a66d09491d46411ab70ca6938ca9/83a8b/yarn.test.png\"\n        srcset=\"/static/3dd3a66d09491d46411ab70ca6938ca9/8992e/yarn.test.png 163w,\n/static/3dd3a66d09491d46411ab70ca6938ca9/ae0a7/yarn.test.png 325w,\n/static/3dd3a66d09491d46411ab70ca6938ca9/83a8b/yarn.test.png 650w,\n/static/3dd3a66d09491d46411ab70ca6938ca9/50453/yarn.test.png 975w,\n/static/3dd3a66d09491d46411ab70ca6938ca9/af9d4/yarn.test.png 1300w,\n/static/3dd3a66d09491d46411ab70ca6938ca9/b3739/yarn.test.png 1876w\"\n        sizes=\"(max-width: 650px) 100vw, 650px\"\n      />\n  </span></p>\n<ul>\n<li>\n<p>Did your tests pass?</p>\n</li>\n<li>\n<p>If you get a weird error like the following, try installing watchman as reported here: <a href=\"https://github.com/facebookincubator/create-react-app/issues/871\">watchman bug</a></p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Error: Error watching file for changes: EMFILE\n    at exports._errnoException (util.js:953:11)\n    at FSEvent.FSWatcher._handle.onchange (fs.js:1400:11)\nyarn ERR! Test failed.  See above for more details.</code></pre></div>\n<ul>\n<li>\n<p>There are many more assertions that are possible!</p>\n<ul>\n<li>Test for a css classname</li>\n<li>Test component state internal object representation</li>\n<li>We’ll do more testing in upcoming labs, but you can study ahead:</li>\n<li><a href=\"http://facebook.github.io/jest/docs/expect.html\">Jest Expect</a> assertions</li>\n<li><a href=\"http://airbnb.io/enzyme/index.html\">Enzyme</a> testing features</li>\n<li><a href=\"https://github.com/blainekasten/enzyme-matchers\">Enzyme Matchers</a> api</li>\n</ul>\n</li>\n</ul>\n<p> </p>\n<h2>Let’s render our Projects table to the Browser!!</h2>\n<ul>\n<li>\n<p>Open <strong>src/App.js</strong>, and tell <strong>React</strong> to render our component into our app.</p>\n<ul>\n<li>We first need to import our <strong>Projects</strong> component.</li>\n<li>We then use the <code class=\"language-text\">render()</code> method to place it on our page:</li>\n</ul>\n</li>\n</ul>\n<div class=\"gatsby-code-title\">src/App.js</div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> Projects <span class=\"token keyword\">from</span> <span class=\"token string\">'./projects/Projects'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\">  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>App<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>container<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Projects</span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span></code></pre></div>\n<p> </p>\n<ul>\n<li>\n<p>How does React get rendered?</p>\n<ul>\n<li><strong>App.js</strong> is what we’re treating as our root component - the base piece of React that encompasses our entire SPA</li>\n<li>Take a look at <strong>src/index.js</strong> - this JavaScript is run at load time (our Webpack setup makes this file the “entrypoint” of our application). It takes the <code class=\"language-text\">App</code> component and renders it into a DOM node with an id of “root”. This is how React gets bootstrapped.</li>\n</ul>\n</li>\n</ul>\n<h2>Run the application and see your work.</h2>\n<ul>\n<li>In a terminal window run: <code class=\"language-text\">yarn start</code> to fire off the build.</li>\n<li>Navigate to <a href=\"http://localhost:3000\">http://localhost:3000</a> in your favorite browser (if it doesn’t automatically open)</li>\n</ul>\n<p><span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 650px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 21.58626328699918%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAiElEQVQY04WQWQrEMAxDe/8r5gAlU5qtabNHgw0eQn/GIDCReDLZeu+Yc2Idemut8X6eJ5RS0Frj3xBnu64LpRSklJBzwRgDIQQ45xhca8XzPOzf940YI+ep8C0GyjXGGA7TThCByU7Az3Fg33culNyqH5BEsJQzXyiN4kmp9x7WWoZTbvXl675CSTlBRky/2gAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    ></span>\n    <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;\"\n        alt=\"lab 02 complete\"\n        title=\"\"\n        src=\"/static/a394bede74e7ec7b8addc9ca09919284/83a8b/lab-02-complete.png\"\n        srcset=\"/static/a394bede74e7ec7b8addc9ca09919284/8992e/lab-02-complete.png 163w,\n/static/a394bede74e7ec7b8addc9ca09919284/ae0a7/lab-02-complete.png 325w,\n/static/a394bede74e7ec7b8addc9ca09919284/83a8b/lab-02-complete.png 650w,\n/static/a394bede74e7ec7b8addc9ca09919284/50453/lab-02-complete.png 975w,\n/static/a394bede74e7ec7b8addc9ca09919284/af9d4/lab-02-complete.png 1300w,\n/static/a394bede74e7ec7b8addc9ca09919284/7cf95/lab-02-complete.png 1950w,\n/static/a394bede74e7ec7b8addc9ca09919284/ecb17/lab-02-complete.png 2446w\"\n        sizes=\"(max-width: 650px) 100vw, 650px\"\n      />\n  </span></p>\n<p> </p>\n<h3>Commit your changes to Git and get ready for the next lab.</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">git add .\ngit commit -m &quot;Lab 2 completed successfully&quot;</code></pre></div>\n<h2>Extra Credit</h2>\n<p>If you’re looking for an extra challenge, take a look at <a href=\"http://facebook.github.io/jest/blog/2016/07/27/jest-14.html\">Jest Snapshot testing</a>. On first run, jest will generate a snapshot file that represents the rendered react component in a __snapshots__ folder. On subsequent runs it will compare the test result to the previous snapshot file. On a failure you will have to decide whether to fix the code, modify the test, or press ‘u’ to update the snapshot file with the new rendering.</p>\n<p>Snapshot testing can save you time from writing individual expect assertions on elements, by simply allowing you to review the snapshot file on any changes. It also serves as a useful “tripwire” to inform developers that they may have impacted components/logic they didn’t intend to.</p>\n<p>Try creating a Snapshot test inside ProjectRow.test.js, or:</p>\n<details>\n<summary>Click here for an example ProjectRow.test.js test</summary>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should render to match the snapshot'</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\">expect</span><span class=\"token punctuation\">(</span>wrapper<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toMatchSnapshot</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</details>\n<p> </p>\n<ul>\n<li>Now take a look at the generated __snapshots__/ProjectRow.test.js.snap file to see what the rendered ProjectRow component looks like</li>\n<li>Modify one of the project attributes to a different value</li>\n<li>See that the test now fails</li>\n<li>Update the snapshot to match the updated test</li>\n<li>re-run the tests and see that they are all passing</li>\n</ul>\n<p><code class=\"language-text\">git add .</code> and <code class=\"language-text\">git commit -m &quot;extra credit&quot;</code> when you are done</p>"}},"pageContext":{"next":{"node":{"fields":{"slug":"/labs/routing-and-components"},"frontmatter":{"title":"Routing and Components","index":3}}},"slug":"/labs/your-first-react-component"}}