<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ professionalism - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ professionalism - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 30 May 2026 22:26:18 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/professionalism/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ How to Write Testable Code | Khalil's Methodology ]]>
                </title>
                <description>
                    <![CDATA[ By Khalil Stemmler Understanding how to write testable code is one of the biggest frustrations I had when I finished school and started working at my first real-world job. Today, while I was working on a chapter in solidbook.io, I was breaking down s... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-write-testable-code/</link>
                <guid isPermaLink="false">66d45f6a36c45a88f96b7cf1</guid>
                
                    <category>
                        <![CDATA[ professionalism ]]>
                    </category>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                    <category>
                        <![CDATA[ TypeScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 20 Jan 2020 17:53:08 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/02/testable-code.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Khalil Stemmler</p>
<p>Understanding how to write testable code is one of the biggest frustrations I had when I finished school and started working at my first real-world job.</p>
<p>Today, while I was working on a chapter in <a target="_blank" href="https://solidbook.io">solidbook.io</a>, I was breaking down some code and picking apart everything wrong with it. And I realized that several principles govern how I write code to be testable. </p>
<p>In this article, I want to present you with a straightforward methodology you can apply to both front-end and back-end code for how to write testable code. </p>
<h2 id="heading-prerequisite-readings">Prerequisite readings</h2>
<p>You may want to read the following pieces beforehand. ?</p>
<ul>
<li><a target="_blank" href="https://khalilstemmler.com/articles/tutorials/dependency-injection-inversion-explained/">Dependency Injection &amp; Inversion Explained | Node.js w/ TypeScript</a></li>
<li><a target="_blank" href="https://khalilstemmler.com/wiki/dependency-rule/">The Dependency Rule</a></li>
<li><a target="_blank" href="https://khalilstemmler.com/wiki/stable-dependency-principle/">The Stable Dependency Principle - SDP</a></li>
</ul>
<h2 id="heading-dependencies-are-relationships">Dependencies are relationships</h2>
<p>You may already know this, but the first thing to understand is that when we import or <em>even mention</em> the name of another class, function, or variable from one class (let's call this the <em>source class</em>), whatever was mentioned <u>becomes a dependency to the source class</u>.</p>
<p>In the <a target="_blank" href="https://khalilstemmler.com/articles/tutorials/dependency-injection-inversion-explained/">dependency inversion &amp; injection article</a>, we looked at an example of a <code>UserController</code> that needed access to a <code>UserRepo</code> to <strong>get all users</strong>.</p>
<pre><code class="lang-typescript"><span class="hljs-comment">// controllers/userController.ts</span>

<span class="hljs-keyword">import</span> { UserRepo } <span class="hljs-keyword">from</span> <span class="hljs-string">'../repos'</span> <span class="hljs-comment">// Bad</span>

<span class="hljs-comment">/**
 * @class UserController
 * @desc Responsible for handling API requests for the
 * /user route.
 **/</span>

<span class="hljs-keyword">class</span> UserController {
  <span class="hljs-keyword">private</span> userRepo: UserRepo;

  <span class="hljs-keyword">constructor</span> (<span class="hljs-params"></span>) {
    <span class="hljs-built_in">this</span>.userRepo = <span class="hljs-keyword">new</span> UserRepo(); <span class="hljs-comment">// Also bad.</span>
  }

  <span class="hljs-keyword">async</span> handleGetUsers (req, res): <span class="hljs-built_in">Promise</span>&lt;<span class="hljs-built_in">void</span>&gt; {
    <span class="hljs-keyword">const</span> users = <span class="hljs-keyword">await</span> <span class="hljs-built_in">this</span>.userRepo.getUsers();
    <span class="hljs-keyword">return</span> res.status(<span class="hljs-number">200</span>).json({ users });
  }
}
</code></pre>
<p>The problem with this approach was that when we do this, we create a hard <strong>source-code dependency</strong>.</p>
<p>The relationship looks like the following:</p>
<p><img src="https://khalilstemmler.com/img/blog/di-container/before-dependency-inversion.svg" alt="before-dependency-inversion" width="363" height="40" loading="lazy"></p>
<p><em>UserController relies directly on UserRepo.</em></p>
<p>This means that if we ever wanted to test <code>UserController</code>, we'd need to bring <code>UserRepo</code> along for the ride as well. The thing about <code>UserRepo</code>, though, is that it also brings a whole damn database connection with it as well. And that's no good.</p>
<p>If we need to spin up a database to run unit tests, that makes all our unit tests slow.</p>
<p>Ultimately, we can fix this by using <strong>dependency inversion</strong>, putting an abstraction between the two dependencies.</p>
<blockquote>
<p><b>Abstractions</b> that can invert the flow of dependencies are either <i>interfaces</i> or <i>abstract classes</i>.</p>
</blockquote>
<p><img src="https://khalilstemmler.com/img/blog/di-container/after-dependency-inversion.svg" width="712" height="153" alt="after-dependency-inversion" loading="lazy"></p>
<p><em>Using an interface to implement Dependency Inversion.</em></p>
<p>This works by placing an abstraction (interface or abstract class) in between the dependency you want to import and the source class. The source class imports the abstraction, and remains testable because we can pass in <em>anything</em> that has adhered to the contract of the abstraction, even if it's a <em>mock object</em>.</p>
<pre><code class="lang-typescript"><span class="hljs-comment">// controllers/userController.ts</span>

<span class="hljs-keyword">import</span> { IUserRepo } <span class="hljs-keyword">from</span> <span class="hljs-string">'../repos'</span> <span class="hljs-comment">// Good! Refering to the abstraction.</span>

<span class="hljs-comment">/**
 * @class UserController
 * @desc Responsible for handling API requests for the
 * /user route.
 **/</span>

<span class="hljs-keyword">class</span> UserController {
  <span class="hljs-keyword">private</span> userRepo: IUserRepo; <span class="hljs-comment">// abstraction here</span>

  <span class="hljs-keyword">constructor</span> (<span class="hljs-params">userRepo: IUserRepo</span>) { <span class="hljs-comment">// and here</span>
    <span class="hljs-built_in">this</span>.userRepo = userRepo;
  }

  <span class="hljs-keyword">async</span> handleGetUsers (req, res): <span class="hljs-built_in">Promise</span>&lt;<span class="hljs-built_in">void</span>&gt; {
    <span class="hljs-keyword">const</span> users = <span class="hljs-keyword">await</span> <span class="hljs-built_in">this</span>.userRepo.getUsers();
    <span class="hljs-keyword">return</span> res.status(<span class="hljs-number">200</span>).json({ users });
  }
}
</code></pre>
<p>In our scenario with <code>UserController</code>, it now refers to an <code>IUserRepo</code> interface (which costs nothing) rather than referring to the potentially heavy <code>UserRepo</code> that carries a db connection with it everywhere it goes.</p>
<p>If we wish to test the controller, we can satisfy the <code>UserController</code>'s need for an <code>IUserRepo</code> by substituting our db-backed <code>UserRepo</code> for an <em>in-memory implementation</em>. We can create one like this:</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">class</span> InMemoryMockUserRepo <span class="hljs-keyword">implements</span> IUserRepo { 
  ... <span class="hljs-comment">// implement methods and properties</span>
}
</code></pre>
<h2 id="heading-the-methodology">The methodology</h2>
<p>Here's my thought process for keeping code testable. It all starts when you want to create a relationship from one class to another.</p>
<blockquote>
<p>Start: You want to import or mention the name of a class from another file.</p>
</blockquote>
<p>Question: do you care about being able to write tests against the <em>source class</em> in the future?</p>
<p>If <strong>no</strong>, go ahead and import whatever it is because it doesn't matter.</p>
<p>If <strong>yes</strong>, consider the following restrictions. You may depend on the class only if it is <em>at least one</em> of these:</p>
<ul>
<li>The dependency is an abstraction (interface or abstract class).</li>
<li>The dependency is from the same layer or an inner layer (see <a target="_blank" href="https://khalilstemmler.com/wiki/dependency-rule/">The Dependency Rule</a>).</li>
<li>It is a <a target="_blank" href="https://khalilstemmler.com/wiki/stable-dependency-principle/">stable dependency</a>.</li>
</ul>
<blockquote>
<p>If at <em>least one</em> of these conditions passes, import the dependency- otherwise, don't.</p>
</blockquote>
<p>Importing the dependency introduces the possibility that it will be hard to test the source component in the future.</p>
<p>Again, you can fix scenarios where the dependency breaks one of those rules by using <a target="_blank" href="https://khalilstemmler.com/articles/tutorials/dependency-injection-inversion-explained/">Dependency Inversion</a>.</p>
<h2 id="heading-front-end-example-react-w-typescript">Front-end example (React w/ TypeScript)</h2>
<p>What about front-end development?</p>
<p>The same rules apply!</p>
<p>Take this React component (pre-hooks) involving a <em>container component</em> (inner layer concern) that depends on a <code>ProfileService</code> (outer layer - infra). </p>
<pre><code class="lang-typescript"><span class="hljs-comment">// containers/ProfileContainer.tsx</span>

<span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>
<span class="hljs-keyword">import</span> { ProfileService } <span class="hljs-keyword">from</span> <span class="hljs-string">'./services'</span>; <span class="hljs-comment">// hard source-code dependency</span>
<span class="hljs-keyword">import</span> { IProfileData } <span class="hljs-keyword">from</span> <span class="hljs-string">'./models'</span>      <span class="hljs-comment">// stable dependency</span>

<span class="hljs-keyword">interface</span> ProfileContainerProps {}

<span class="hljs-keyword">interface</span> ProfileContainerState {
  profileData: IProfileData | {};
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">class</span> ProfileContainer <span class="hljs-keyword">extends</span> React.Component&lt;
  ProfileContainerProps, 
  ProfileContainerState
&gt; {

  <span class="hljs-keyword">private</span> profileService: ProfileService;

  <span class="hljs-keyword">constructor</span> (<span class="hljs-params">props: ProfileContainerProps</span>) {
    <span class="hljs-built_in">super</span>(props);
    <span class="hljs-built_in">this</span>.state = {
      profileData: {}
    }
    <span class="hljs-built_in">this</span>.profileService = <span class="hljs-keyword">new</span> ProfileService(); <span class="hljs-comment">// Bad.</span>
  }

  <span class="hljs-keyword">async</span> componentDidMount () {
    <span class="hljs-keyword">try</span> {
      <span class="hljs-keyword">const</span> profileData: IProfileData = <span class="hljs-keyword">await</span> <span class="hljs-built_in">this</span>.profileService.getProfile();

      <span class="hljs-built_in">this</span>.setState({
        ...this.state,
        profileData
      })
    } <span class="hljs-keyword">catch</span> (err) {
      alert(<span class="hljs-string">"Ooops"</span>)
    }
  }

  render () {
    <span class="hljs-keyword">return</span> (
      &lt;div&gt;Im a profile container&lt;/div&gt;
    )
  }
}
</code></pre>
<p>If <code>ProfileService</code> is something that makes network calls to a RESTful API, there's no way for us to test <code>ProfileContainer</code> and prevent it from making real API calls.</p>
<p>We can fix this by doing two things:</p>
<h3 id="heading-1-putting-an-interface-in-between-the-profileservice-and-profilecontainer">1. Putting an interface in between the <code>ProfileService</code> and <code>ProfileContainer</code></h3>
<p>First, we create the abstraction and then ensure that <code>ProfileService</code> implements it.</p>
<pre><code class="lang-typescript"><span class="hljs-comment">// services/index.tsx</span>
<span class="hljs-keyword">import</span> { IProfileData } <span class="hljs-keyword">from</span> <span class="hljs-string">"../models"</span>;

<span class="hljs-comment">// Create an abstraction</span>
<span class="hljs-keyword">export</span> <span class="hljs-keyword">interface</span> IProfileService { 
  getProfile: <span class="hljs-function">() =&gt;</span> <span class="hljs-built_in">Promise</span>&lt;IProfileData&gt;;
}

<span class="hljs-comment">// Implement the abstraction</span>
<span class="hljs-keyword">export</span> <span class="hljs-keyword">class</span> ProfileService <span class="hljs-keyword">implements</span> IProfileService {
  <span class="hljs-keyword">async</span> getProfile(): <span class="hljs-built_in">Promise</span>&lt;IProfileData&gt; {
    ...
  }
}
</code></pre>
<p>An abstraction for ProfileService in the form of an interface.</p>

<p>Then we update <code>ProfileContainer</code> to rely on the abstraction instead.</p>
<pre><code class="lang-typescript"><span class="hljs-comment">// containers/ProfileContainer.tsx</span>
<span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>
<span class="hljs-keyword">import</span> { 
  ProfileService, 
  IProfileService 
} <span class="hljs-keyword">from</span> <span class="hljs-string">'./services'</span>; <span class="hljs-comment">// import interface</span>
<span class="hljs-keyword">import</span> { IProfileData } <span class="hljs-keyword">from</span> <span class="hljs-string">'./models'</span> 

<span class="hljs-keyword">interface</span> ProfileContainerProps {}

<span class="hljs-keyword">interface</span> ProfileContainerState {
  profileData: IProfileData | {};
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">class</span> ProfileContainer <span class="hljs-keyword">extends</span> React.Component&lt;
  ProfileContainerProps, 
  ProfileContainerState
&gt; {

  <span class="hljs-keyword">private</span> profileService: IProfileService;

  <span class="hljs-keyword">constructor</span> (<span class="hljs-params">props: ProfileContainerProps</span>) {
    <span class="hljs-built_in">super</span>(props);
    <span class="hljs-built_in">this</span>.state = {
      profileData: {}
    }
    <span class="hljs-built_in">this</span>.profileService = <span class="hljs-keyword">new</span> ProfileService(); <span class="hljs-comment">// Still bad though</span>
  }

  <span class="hljs-keyword">async</span> componentDidMount () {
    <span class="hljs-keyword">try</span> {
      <span class="hljs-keyword">const</span> profileData: IProfileData = <span class="hljs-keyword">await</span> <span class="hljs-built_in">this</span>.profileService.getProfile();

      <span class="hljs-built_in">this</span>.setState({
        ...this.state,
        profileData
      })
    } <span class="hljs-keyword">catch</span> (err) {
      alert(<span class="hljs-string">"Ooops"</span>)
    }
  }

  render () {
    <span class="hljs-keyword">return</span> (
      &lt;div&gt;Im a profile container&lt;/div&gt;
    )
  }
}
</code></pre>
<h3 id="heading-2-compose-a-profilecontainer-with-a-hoc-that-contains-a-valid-iprofileservice">2. Compose a <code>ProfileContainer</code> with a HOC that contains a valid <code>IProfileService</code>.</h3>
<p>Now we can create HOCs that use whatever kind of <code>IProfileService</code> we wish. It could be the one that connects to an API like what follows:</p>
<pre><code class="lang-typescript"><span class="hljs-comment">// hocs/withProfileService.tsx</span>

<span class="hljs-keyword">import</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;
<span class="hljs-keyword">import</span> { ProfileService } <span class="hljs-keyword">from</span> <span class="hljs-string">"../services"</span>;

<span class="hljs-keyword">interface</span> withProfileServiceProps {}

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">withProfileService</span>(<span class="hljs-params">WrappedComponent: <span class="hljs-built_in">any</span></span>) </span>{
  <span class="hljs-keyword">class</span> HOC <span class="hljs-keyword">extends</span> React.Component&lt;withProfileServiceProps, <span class="hljs-built_in">any</span>&gt; {
    <span class="hljs-keyword">private</span> profileService: ProfileService;

    <span class="hljs-keyword">constructor</span>(<span class="hljs-params">props: withProfileServiceProps</span>) {
      <span class="hljs-built_in">super</span>(props);
      <span class="hljs-built_in">this</span>.profileService = <span class="hljs-keyword">new</span> ProfileService();
    }

    render() {
      <span class="hljs-keyword">return</span> (
        &lt;WrappedComponent
          profileService={<span class="hljs-built_in">this</span>.profileService}
          {...this.props}
        /&gt;
      );
    }
  }
  <span class="hljs-keyword">return</span> HOC;
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> withProfileService;
</code></pre>
<p>Or it could be a mock one that uses an in-memory profile service as well.</p>
<pre><code class="lang-typescript"><span class="hljs-comment">// hocs/withMockProfileService.tsx</span>

<span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;
<span class="hljs-keyword">import</span> { MockProfileService } <span class="hljs-keyword">from</span> <span class="hljs-string">"../services"</span>;

<span class="hljs-keyword">interface</span> withProfileServiceProps {}

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">withProfileService</span>(<span class="hljs-params">WrappedComponent: <span class="hljs-built_in">any</span></span>) </span>{
  <span class="hljs-keyword">class</span> HOC <span class="hljs-keyword">extends</span> React.Component&lt;withProfileServiceProps, <span class="hljs-built_in">any</span>&gt; {
    <span class="hljs-keyword">private</span> profileService: MockProfileService;

    <span class="hljs-keyword">constructor</span>(<span class="hljs-params">props: withProfileServiceProps</span>) {
      <span class="hljs-built_in">super</span>(props);
      <span class="hljs-built_in">this</span>.profileService = <span class="hljs-keyword">new</span> MockProfileService();
    }

    render() {
      <span class="hljs-keyword">return</span> (
        &lt;WrappedComponent
          profileService={<span class="hljs-built_in">this</span>.profileService}
          {...this.props}
        /&gt;
      );
    }
  }
  <span class="hljs-keyword">return</span> HOC;
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> withProfileService;
</code></pre>
<p>For our <code>ProfileContainer</code> to utilize the <code>IProfileService</code> from an HOC, it has to expect to receive an <code>IProfileService</code> as a prop within <code>ProfileContainer</code> rather than being added to the class as an attribute.</p>
<pre><code class="lang-typescript"><span class="hljs-comment">// containers/ProfileContainer.tsx</span>

<span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;
<span class="hljs-keyword">import</span> { IProfileService } <span class="hljs-keyword">from</span> <span class="hljs-string">"./services"</span>;
<span class="hljs-keyword">import</span> { IProfileData } <span class="hljs-keyword">from</span> <span class="hljs-string">"./models"</span>;

<span class="hljs-keyword">interface</span> ProfileContainerProps {
  profileService: IProfileService;
}

<span class="hljs-keyword">interface</span> ProfileContainerState {
  profileData: IProfileData | {};
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">class</span> ProfileContainer <span class="hljs-keyword">extends</span> React.Component&lt;
  ProfileContainerProps,
  ProfileContainerState
&gt; {
  <span class="hljs-keyword">constructor</span>(<span class="hljs-params">props: ProfileContainerProps</span>) {
    <span class="hljs-built_in">super</span>(props);
    <span class="hljs-built_in">this</span>.state = {
      profileData: {}
    };
  }

  <span class="hljs-keyword">async</span> componentDidMount() {
    <span class="hljs-keyword">try</span> {
      <span class="hljs-keyword">const</span> profileData: IProfileData = <span class="hljs-keyword">await</span> <span class="hljs-built_in">this</span>.props.profileService.getProfile();

      <span class="hljs-built_in">this</span>.setState({
        ...this.state,
        profileData
      });
    } <span class="hljs-keyword">catch</span> (err) {
      alert(<span class="hljs-string">"Ooops"</span>);
    }
  }

  render() {
    <span class="hljs-keyword">return</span> &lt;div&gt;Im a profile container&lt;/div&gt;
  }
}
</code></pre>
<p>Finally, we can compose our <code>ProfileContainer</code> with whichever HOC we want- the one containing the real service, or the one containing the fake service for testing.</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;
<span class="hljs-keyword">import</span> { render } <span class="hljs-keyword">from</span> <span class="hljs-string">"react-dom"</span>;
<span class="hljs-keyword">import</span> withProfileService <span class="hljs-keyword">from</span> <span class="hljs-string">"./hocs/withProfileService"</span>;
<span class="hljs-keyword">import</span> withMockProfileService <span class="hljs-keyword">from</span> <span class="hljs-string">"./hocs/withMockProfileService"</span>;
<span class="hljs-keyword">import</span> { ProfileContainer } <span class="hljs-keyword">from</span> <span class="hljs-string">"./containers/profileContainer"</span>;

<span class="hljs-comment">// The real service</span>
<span class="hljs-keyword">const</span> ProfileContainerWithService = withProfileService(ProfileContainer);
<span class="hljs-comment">// The mock service</span>
<span class="hljs-keyword">const</span> ProfileContainerWithMockService = withMockProfileService(ProfileContainer);

<span class="hljs-keyword">class</span> App <span class="hljs-keyword">extends</span> React.Component&lt;{}, IState&gt; {
  <span class="hljs-keyword">public</span> render() {
    <span class="hljs-keyword">return</span> (
      &lt;div&gt;
        &lt;ProfileContainerWithService /&gt;
      &lt;/div&gt;
    );
  }
}

render(&lt;App /&gt;, <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"root"</span>));
</code></pre>
<hr>
<p>I'm Khalil. I'm a Developer Advocate @ <a target="_blank" href="https://www.apollographql.com/docs/?utm_source=khalil&amp;utm_medium=khalil_post_footer&amp;utm_campaign=how_to_write_testable_code">Apollo GraphQL</a>. I also create courses, books, and articles for aspiring developers on Enterprise Node.js, Domain-Driven Design and writing testable, flexible JavaScript.</p>
<p>This was originally posted on my blog @ <a target="_blank" href="https://khalilstemmler.com">khalilstemmler.com</a> and appears in Chapter 11 of <a target="_blank" href="https://solidbook.io">solidbook.io - An Introduction to Software Design &amp; Architecture w/ Node.js &amp; TypeScript</a>.</p>
<p>You can reach out and ask me anything on <a target="_blank" href="https://twitter.com/stemmlerjs">Twitter</a>!</p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
