<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
	<channel>
		<title>Easy Way to Implement Demo Mode in iOS Apps | Infinum</title>
		<atom:link href="https://infinum.com/blog/easy-way-to-implement-demo-mode-in-ios-apps/feed/" rel="self" type="application/rss+xml" />
		<link>https://infinum.com/blog/easy-way-to-implement-demo-mode-in-ios-apps/</link>
		<description>Building digital products</description>
		<lastBuildDate>Fri, 17 Apr 2026 13:59:15 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>

					<item>
				<image>
					<url>8110https://infinum.com/uploads/2019/11/easy-way-to-implement-demo-mode-in-ios-apps-0.webp</url>
				</image>
				<title>Easy Way to Implement Demo Mode in iOS Apps</title>
				<link>https://infinum.com/blog/easy-way-to-implement-demo-mode-in-ios-apps/</link>
				<pubDate>Wed, 20 Nov 2019 12:10:00 +0000</pubDate>
				<dc:creator>Goran Brlas</dc:creator>
				<guid isPermaLink="false">https://infinum.com/the-capsized-eight/easy-way-to-implement-demo-mode-in-ios-apps/</guid>
				<description>
					<![CDATA[<p>Ever thought about adding demo mode to your application?Probably not. But there are many scenarios when the demo mode comes in handy.</p>
<p>The post <a href="https://infinum.com/blog/easy-way-to-implement-demo-mode-in-ios-apps/">Easy Way to Implement Demo Mode in iOS Apps</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-231"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-92">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-95"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-93">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-94'
	>
	Ever thought about adding demo mode to your application? If I were guessing, I’d say most of you probably haven’t. It’s not a bad thing, it just means you haven’t yet encountered a problem or use case requiring you to build one. However, there are a lot of scenarios when the demo mode comes in handy.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-98"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-96">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-97'
	>
	In this article, I’ll show you that <strong>implementing a demo mode doesn’t require a lot of time</strong>, all the while keeping your existing logic pretty much intact. While we’re at it, the solution I’m going to show you will also make your development life easier in cases where the API is still work in progress, or just flat out refusing to cooperate.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-101"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-99">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-100'
	>
	Demo mode use cases</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-104"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-102">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-103'
	>
	One example that comes to mind would be in AppStore reviews for apps which require a login but can’t really provide a test user. Think of all the banking apps that require users to be legal entities in the app’s origination country.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-107"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-105">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-106'
	>
	Other use cases could be apps that would like to show off their premium features without providing a trial period, or maybe those with sensitive data management that would like to familiarize their users with the application’s feature flow before throwing them into the “lion’s den”.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-110"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-108">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-109'
	>
	My team has encountered similar cases in the projects we’ve worked on, so we had to come up with a <strong>scalable and maintainable</strong> way of making it work.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-113"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-111">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-112'
	>
	Implementing demo mode inside an app</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-116"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-114">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-115'
	>
	When starting to think about implementing demo mode inside an app, your first thought might be to add an additional parameter to your API call site specifying whether the call should be executed or mocked.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-119"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-117">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-118'
	>
	This would work, but it would also require a lot of “copypasta”, and every new API call you implement should also have the same logic. Since we’re aiming for scalability and maintainability, this approach isn’t the way to go. As your app grows, it would introduce a lot of switch-cases and logic duplication and frankly, it would get tiring quickly.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-122"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-120">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-121'
	>
	That is why we’ve decided to make something better  -  a <strong>demo manager</strong>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-127"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-123">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-124'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-125'
	>
	You’re probably thinking “Another manager? But I’ve already got a ton of them and I’ve read several blog posts telling me that they’re bad”.</p>
		<div class="blockquote__caption-wrap">
					</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-130"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-128">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-129'
	>
	This could be a common response to my proposal since developers like to introduce managers everywhere, even in places where they don’t really make much sense. But bear with me for a minute, this is a use case where a manager fits like a glove.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-133"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-131">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-132'
	>
	The hidden gems</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-136"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-134">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-135'
	>
	Our demo manager appears quite basic when you look at it from the outside. After all, it only has a single state parameter <code>isEnabled</code> telling us whether our API calls are being actively mocked or not. However, its <em>”hidden”</em> responsibilities are where the money’s at, so let’s take a look at them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-139"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-137">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-138'
	>
	The first responsibility is <strong>hooking onto every API call</strong> your application makes, while the second one builds upon the first one by <strong>filtering those API calls</strong> in the following way:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-142"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-140">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-141'
	>
	<li>if it should be mocked -&gt; read the response from a stored file and forward it as a response to your business logic,</li><li>if it shouldn’t be mocked -&gt; make an API call to the server (same as before).</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-145"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-143">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-144'
	>
	For API call mocking, we’re going to use <a href="https://github.com/AliSoftware/OHHTTPStubs">OHTTPStubs</a>, a library designed to stub network requests by using method swizzling. It works with <code>NSURLConnection, NSURLSession, AFNetworking, Alamofire</code> or any networking framework that uses Cocoa’s URL Loading System, so it’s perfect for our use case.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-148"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-146">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-147'
	>
	Of course, if you don’t like adding pods to your projects, you could implement your own hooking logic, but that isn’t the point of this tutorial so I’ll leave that to the brave.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-151"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-149">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-150'
	>
	Getting down to the code</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-154"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-152">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-153'
	>
	Now that we’ve covered the <em>what</em> and <em>why</em>, let’s move on to the <em>how</em>. We’ll start with the top-down approach, building our demo manager in several steps.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-156"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">import</span><span class="token"> </span><span class="token" style="color: #6f42c1;">UIKit</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">import</span><span class="token"> </span><span class="token" style="color: #6f42c1;">OHHTTPStubs</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">class DemoManager</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">static</span><span class="token"> </span><span class="token" style="color: #d73a49;">var</span><span class="token"> instance </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">DemoManager(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">var isEnabled:</span><span class="token"> </span><span class="token" style="color: #005cc5;">Bool</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">get</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #d73a49;">!</span><span class="token">OHHTTPStubs.</span><span class="token">allStubs(</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #005cc5;">isEmpty</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">set</span><span class="token"> </span><span class="token">(</span><span class="token">newValue</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">switch</span><span class="token"> newValue </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">case</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token">setupStubResponses(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">case</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token" style="color: #d73a49;">:</span><span class="token"> OHHTTPStubs.</span><span class="token">removeAllStubs(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token" style="color: #d73a49;">init</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-159"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-157">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-158'
	>
	As you can see, our demo manager is a singleton, with one variable for switching the mocking on/off. It might look simple, but this single point of entry provides us with great flexibility . If you want to mock everything in the application, all you have to do is just set the <code>isEnabled</code> parameter to true when the application starts and you’re golden.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-162"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-160">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-161'
	>
	However, if you want a bit more specificity, you have free reign to do so. For example, your API call mocking can start only when you get to a screen which still doesn’t have an API implementation ready on the backend side, and can be turned off when you navigate off this screen.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-164"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token" style="color: #d73a49;">extension</span><span class="token"> </span><span class="token" style="color: #6f42c1;">DemoManager</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">func setupStubResponses</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">stubSomething(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">stubUpdatingSomething(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">stubSomethingWithPagination(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">func stubSomething</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">stubResponse(</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">containing:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/apiPath/somethingMockedPath</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">statusCode:</span><span class="token"> </span><span class="token" style="color: #005cc5;">200</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">from:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">something_mocked</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">func stubUpdatingSomething</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">stubResponse(</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">containing:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/apiPath/somethingToUpdate</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">method:</span><span class="token"> .</span><span class="token">patch</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">statusCode:</span><span class="token"> </span><span class="token" style="color: #005cc5;">200</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">func stubSomethingWithPagination</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">stubResponse(</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">containing:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/apiPath/somethingPaginated</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">queryParamPart:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">cursor=0</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">statusCode:</span><span class="token"> </span><span class="token" style="color: #005cc5;">200</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">from:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">something_paginated_first_page</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">stubResponse(</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">containing:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/apiPath/somethingPaginated</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">queryParamPart:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">cursor=1</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">statusCode:</span><span class="token"> </span><span class="token" style="color: #005cc5;">200</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">from:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">something_paginated_second_page</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-167"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-165">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-166'
	>
	Here we can see the implementation of our <code>setupStubResponses()</code> method.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-170"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-168">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-169'
	>
	It stubs different API calls with responses from JSON files – <em>something_mocked</em>, <em>something_paginated_first_page</em> and <em>something_paginated_second_page</em>, while the second call is mocked with just a 200 code telling us that the update was successful.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-173"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-171">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-172'
	>
	Each call is mocked using the <code>stubResponse()</code> method with individual filtering parameters. To understand that there isn’t some black box magic involved, let’s take a look at what’s going on under the hood here.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-175"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token" style="color: #d73a49;">extension</span><span class="token"> </span><span class="token" style="color: #6f42c1;">DemoManager</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">     </span><span class="token" style="color: #6a737d;">/**</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #6a737d;">     Used for creating stubs for API mocking.
</span></span><span class="line"><span class="token" style="color: #6a737d;">     For distinguishing which stub should be used for which API call you should use the following parameters:
</span></span><span class="line"><span class="token" style="color: #6a737d;">        - `urlPart`
</span></span><span class="line"><span class="token" style="color: #6a737d;">        - `queryParamPart`
</span></span><span class="line"><span class="token" style="color: #6a737d;">        - `requiredHeaderValues`
</span></span><span class="line"><span class="token" style="color: #6a737d;">        - `method`
</span></span><span class="line"><span class="token" style="color: #6a737d;">     Successfuly mocked response is defined by:
</span></span><span class="line"><span class="token" style="color: #6a737d;">        - `statusCode`
</span></span><span class="line"><span class="token" style="color: #6a737d;">        - `headers`
</span></span><span class="line"><span class="token" style="color: #6a737d;">        - `fileName`
</span></span><span class="line"><span class="token" style="color: #6a737d;">     - Parameter urlPart: Specifies URL path that should be mocked
</span></span><span class="line"><span class="token" style="color: #6a737d;">     - Parameter queryParamPart: Used for mocking calls with specific query parameters
</span></span><span class="line"><span class="token" style="color: #6a737d;">     - Parameter requiredHeaderValues: Used for mocking calls with specific header values, i.e. can be used for differentiating multiple API calls only by the values in their headers
</span></span><span class="line"><span class="token" style="color: #6a737d;">     - Parameter body: Used for mocking calls with specific parameters in their body
</span></span><span class="line"><span class="token" style="color: #6a737d;">     - Parameter method: The HTTP request method
</span></span><span class="line"><span class="token" style="color: #6a737d;">     - Parameter statusCode: Mocked response status code (can be used for mocking errors)
</span></span><span class="line"><span class="token" style="color: #6a737d;">     - Parameter headers: Header values sent in mocked response
</span></span><span class="line"><span class="token" style="color: #6a737d;">     - Parameter fileName: JSON file from which response data should be read
</span></span><span class="line"><span class="token" style="color: #6a737d;">     </span><span class="token" style="color: #6a737d;">*/</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">func stubResponse</span><span class="token">(</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">containing urlPart</span><span class="token">: </span><span class="token" style="color: #005cc5;">String</span><span class="token">,
</span></span><span class="line"><span class="token">        </span><span class="token">queryParamPart</span><span class="token">: </span><span class="token" style="color: #005cc5;">String</span><span class="token" style="color: #d73a49;">?</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">,
</span></span><span class="line"><span class="token">        </span><span class="token">requiredHeaderValues</span><span class="token">: </span><span class="token" style="color: #005cc5;">String</span><span class="token" style="color: #d73a49;">?</span><span class="token" style="color: #d73a49;">...</span><span class="token">,
</span></span><span class="line"><span class="token">        </span><span class="token">bodyPart</span><span class="token">: </span><span class="token">[</span><span class="token" style="color: #005cc5;">String</span><span class="token">]</span><span class="token" style="color: #d73a49;">?</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">,
</span></span><span class="line"><span class="token">        </span><span class="token">method</span><span class="token">: </span><span class="token">HTTPMethod</span><span class="token" style="color: #d73a49;">?</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> .</span><span class="token">get</span><span class="token">,
</span></span><span class="line"><span class="token">        </span><span class="token">statusCode</span><span class="token">: </span><span class="token" style="color: #005cc5;">Int32</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">200</span><span class="token">,
</span></span><span class="line"><span class="token">        </span><span class="token">headers</span><span class="token">: </span><span class="token">[</span><span class="token" style="color: #005cc5;">AnyHashable</span><span class="token"> </span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">Any</span><span class="token">]</span><span class="token" style="color: #d73a49;">?</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> [</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Content-Type</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">application/json</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">]</span><span class="token">,
</span></span><span class="line"><span class="token">        </span><span class="token">from fileName</span><span class="token">: </span><span class="token" style="color: #005cc5;">String</span><span class="token" style="color: #d73a49;">?</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">stub(</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">condition:</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token">(</span><span class="token">request:</span><span class="token"> URLRequest</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token" style="color: #005cc5;">Bool</span><span class="token"> </span><span class="token" style="color: #d73a49;">in</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;">Method</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token" style="color: #d73a49;">let</span><span class="token"> method </span><span class="token" style="color: #d73a49;">=</span><span class="token"> method</span><span class="token" style="color: #d73a49;">?</span><span class="token">.</span><span class="token" style="color: #005cc5;">rawValue</span><span class="token">.</span><span class="token" style="color: #005cc5;">uppercased</span><span class="token">(</span><span class="token">)</span><span class="token">, 
</span></span><span class="line"><span class="token">                        request.httpMethod</span><span class="token" style="color: #d73a49;">?</span><span class="token">.</span><span class="token" style="color: #005cc5;">uppercased</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">!=</span><span class="token"> method 
</span></span><span class="line"><span class="token">                        </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;">URL, query</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token" style="color: #d73a49;">!</span><span class="token">(</span><span class="token">request.</span><span class="token" style="color: #005cc5;">url</span><span class="token" style="color: #d73a49;">?</span><span class="token">.</span><span class="token">absoluteString</span><span class="token">.</span><span class="token" style="color: #005cc5;">contains</span><span class="token">(</span><span class="token">urlPart</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">??</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token" style="color: #d73a49;">let</span><span class="token"> part </span><span class="token" style="color: #d73a49;">=</span><span class="token"> queryParamPart, 
</span></span><span class="line"><span class="token">                        </span><span class="token" style="color: #d73a49;">!</span><span class="token">(</span><span class="token">request.</span><span class="token" style="color: #005cc5;">url</span><span class="token" style="color: #d73a49;">?</span><span class="token">.</span><span class="token">absoluteString</span><span class="token">.</span><span class="token" style="color: #005cc5;">contains</span><span class="token">(</span><span class="token">part</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">??</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token">)</span><span class="token"> 
</span></span><span class="line"><span class="token">                        </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;">Body</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token" style="color: #d73a49;">let</span><span class="token"> parts </span><span class="token" style="color: #d73a49;">=</span><span class="token"> bodyPart,
</span></span><span class="line"><span class="token">                    </span><span class="token" style="color: #d73a49;">let</span><span class="token"> data </span><span class="token" style="color: #d73a49;">=</span><span class="token"> request.httpBody,
</span></span><span class="line"><span class="token">                    </span><span class="token" style="color: #d73a49;">let</span><span class="token"> body </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">String</span><span class="token">(</span><span class="token">data:</span><span class="token"> data</span><span class="token">, </span><span class="token">encoding:</span><span class="token"> .</span><span class="token" style="color: #005cc5;">utf8</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                    </span><span class="token" style="color: #d73a49;">let</span><span class="token"> bodyPartsPresent </span><span class="token" style="color: #d73a49;">=</span><span class="token"> parts
</span></span><span class="line"><span class="token">                        .</span><span class="token" style="color: #005cc5;">map</span><span class="token"> </span><span class="token">{</span><span class="token"> body.</span><span class="token" style="color: #005cc5;">contains</span><span class="token">(</span><span class="token" style="color: #005cc5;">$0</span><span class="token">)</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">                        .</span><span class="token" style="color: #005cc5;">reduce</span><span class="token">(</span><span class="token" style="color: #005cc5;">true</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #005cc5;">$0</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;&amp;</span><span class="token"> </span><span class="token" style="color: #005cc5;">$1</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">                    </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token" style="color: #d73a49;">!</span><span class="token">bodyPartsPresent </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;">Headers</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">let</span><span class="token"> headers </span><span class="token" style="color: #d73a49;">=</span><span class="token"> request.</span><span class="token">allHTTPHeaderFields</span><span class="token"> </span><span class="token" style="color: #d73a49;">??</span><span class="token"> [</span><span class="token" style="color: #d73a49;">:</span><span class="token">]
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">let</span><span class="token"> headersOk </span><span class="token" style="color: #d73a49;">=</span><span class="token"> requiredHeaderValues
</span></span><span class="line"><span class="token">                    .</span><span class="token">compactMap</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #005cc5;">$0</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">                    .</span><span class="token" style="color: #005cc5;">map</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token">(</span><span class="token">headerValue</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">in</span><span class="token"> headers.</span><span class="token" style="color: #005cc5;">contains</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #005cc5;">$0</span><span class="token">.</span><span class="token" style="color: #005cc5;">value</span><span class="token"> </span><span class="token" style="color: #d73a49;">==</span><span class="token"> headerValue </span><span class="token">}</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">                    .</span><span class="token" style="color: #005cc5;">reduce</span><span class="token">(</span><span class="token" style="color: #005cc5;">true</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #005cc5;">$0</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;&amp;</span><span class="token"> </span><span class="token" style="color: #005cc5;">$1</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token" style="color: #d73a49;">!</span><span class="token">headersOk </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">response:</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #005cc5;">_</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> OHHTTPStubsResponse </span><span class="token" style="color: #d73a49;">in</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">guard</span><span class="token"> </span><span class="token" style="color: #d73a49;">let</span><span class="token"> _fileName </span><span class="token" style="color: #d73a49;">=</span><span class="token"> fileName </span><span class="token" style="color: #d73a49;">else</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                    </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token">OHHTTPStubsResponse(</span><span class="token">data:</span><span class="token"> </span><span class="token">Data(</span><span class="token">)</span><span class="token">, </span><span class="token">statusCode:</span><span class="token"> statusCode</span><span class="token">, </span><span class="token">headers:</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">let</span><span class="token"> path </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Bundle.</span><span class="token">main</span><span class="token">.</span><span class="token">path(</span><span class="token">forResource:</span><span class="token"> _fileName</span><span class="token">, </span><span class="token">ofType:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">json</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">??</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token">fixture(</span><span class="token">filePath:</span><span class="token"> path</span><span class="token">, </span><span class="token">status:</span><span class="token"> statusCode</span><span class="token">, </span><span class="token">headers:</span><span class="token"> headers</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-178"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-176">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-177'
	>
	This method is basically what you’ve been waiting for. It calls <a href="https://github.com/AliSoftware/OHHTTPStubs">OHTTPStubs’s</a> <code>stub()</code> method which does the API call mocking using a <strong>condition closure</strong> and a <strong>response closure</strong>. Each of them plays a major part in mocking your calls, so let’s see what they’re all about.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-181"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-179">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-180'
	>
	Condition closure</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-184"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-182">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-183'
	>
	You can <strong>think of the condition closure as a robust version of filtering</strong>. If it returns <strong>true</strong>, the response closure will be executed, the API call will be mocked and it will never reach the real server. Otherwise, if the condition closure results in <strong>false</strong>, the API call will be executed, just like before.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-187"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-185">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-186'
	>
	In our implementation, we go through several major pillars of every API call in order to determine whether we should mock it:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-190"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-188">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-189'
	>
	<li><strong>API call URL</strong> – the only required parameter in our <code>stubResponse()</code> implementation, and it should match the one in the call itself. We’re using <code>contains()</code> to provide more flexibility here, but you can implement it using letter-to-letter precision or regexes if you wish to.</li><li><strong>queryParamPart</strong> – an optional parameter that defines whether the specific query parameter should appear in the API call in order to be mocked.</li><li><strong>requiredHeaderValues</strong> – optional array of header values that are required to be in the call, otherwise it shouldn’t be mocked.</li><li><strong>bodyPart</strong>  –  optional array of request body values, perfect for cases where your calls are only differentiated by their body parameters.</li><li><strong>method</strong> – specifies the request method, <code>GET</code> is set by default since it’s the most used one.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-193"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-191">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-192'
	>
	If all our checks are successful, our API call is filtered as <strong><em>”good for mocking”</em></strong> and the response closure is then finally called to mock the API call. Otherwise, if the condition closure fails at any of the the aforementioned conditions, the call is forwarded to the server – business as usual.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-196"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-194">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-195'
	>
	Response closure</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-199"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-197">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-198'
	>
	The response closure is used to create the mocked response, and it uses three parameters passed into the <code>stubResponse()</code> – <code>statusCode</code>, <code>method</code> and <code>fileName</code>. We load our mocked response from the file in our bundle using the specified file name, set the headers to the provided values and create the mocked response using the status code.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-202"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-200">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-201'
	>
	This allows us to test our implementation with several responses rather quickly. Want to know how your UI behaves if the array of products you’re expecting is empty? What’s going to happen if the API starts coughing up and returns <em>4xx</em> or <em>5xx</em>?</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-205"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-203">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-204'
	>
	Using the flexibility of call mocking shown here, you can run through all your test scenarios in a breeze, leaving you more time to focus on more important parts of your app.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-208"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-206">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-207'
	>
	One more thing</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-211"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-209">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-210'
	>
	One thing not mentioned above is the usefulness of <a href="https://github.com/AliSoftware/OHHTTPStubs">OHTTPStubs</a> for writing unit tests (which all of us are doing, right?)</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-214"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-212">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-213'
	>
	It comes as a real time-saver when testing your business logic that depends on API call results, and all you need to make it happen is the <code>stubResponse()</code> implementation inside your testing environment.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-217"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-215">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-216'
	>
	You can do that in no time with the knowledge you’ve accrued. Doing that will not only help you with testing, but also make your apps more stable, resulting in happier customers and better app ratings.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-220"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-218">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-219'
	>
	Wrapping it&nbsp;up</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-223"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-221">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-222'
	>
	You’ve just witnessed that the demo manager really is a jack of all trades. It has a wide variety of uses, from showing everything your application has to offer without firing a single “real” API call, to making development faster while waiting for the API team to do their part by mocking the responses based on the agreed specification.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-226"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-224">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-225'
	>
	The best part is that it’s not difficult to implement, so give it a go and reap the benefits of the demo mode in your project.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-229"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-227">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-228'
	>
	Until next time, happy coding!</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/easy-way-to-implement-demo-mode-in-ios-apps/">Easy Way to Implement Demo Mode in iOS Apps</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
		
	</channel>
</rss>