|
4 | 4 | <title><![CDATA[NSHint]]></title>
|
5 | 5 | <link href="http://nshint.github.io/atom.xml" rel="self"/>
|
6 | 6 | <link href="http://nshint.github.io/"/>
|
7 |
| - <updated>2019-04-13T11:51:30+02:00</updated> |
| 7 | + <updated>2019-05-10T22:24:06+02:00</updated> |
8 | 8 | <id>http://nshint.github.io/</id>
|
9 | 9 | <author>
|
10 | 10 | <name><![CDATA[NSHint]]></name>
|
|
13 | 13 | <generator uri="http://octopress.org/">Octopress</generator>
|
14 | 14 |
|
15 | 15 |
|
| 16 | + <entry> |
| 17 | + |
| 18 | + <title type="html"><![CDATA[Testing Codable]]></title> |
| 19 | + <link href="http://nshint.github.io/blog/2019/05/10/testing-codable/"/> |
| 20 | + |
| 21 | + <updated>2019-05-10T19:55:56+02:00</updated> |
| 22 | + <id>http://nshint.github.io/blog/2019/05/10/testing-codable</id> |
| 23 | + |
| 24 | + <content type="html"><![CDATA[<p>Codable is a great protocol available in Swift. It makes it possible to create a type safe JSON representations of structures used within our application with zero boilerplate.</p> |
| 25 | +
|
| 26 | +<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> |
| 27 | +<span class='line-number'>2</span> |
| 28 | +<span class='line-number'>3</span> |
| 29 | +<span class='line-number'>4</span> |
| 30 | +<span class='line-number'>5</span> |
| 31 | +</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">struct</span> <span class="nl">Person</span><span class="p">:</span> <span class="n">Codable</span> <span class="p">{</span> |
| 32 | +</span><span class='line'> <span class="k">let</span> <span class="nl">name</span><span class="p">:</span> <span class="n">String</span> |
| 33 | +</span><span class='line'> <span class="k">let</span> <span class="nl">email</span><span class="p">:</span> <span class="n">String</span> |
| 34 | +</span><span class='line'> <span class="k">let</span> <span class="nl">age</span><span class="p">:</span> <span class="n">Int</span> |
| 35 | +</span><span class='line'><span class="p">}</span> |
| 36 | +</span></code></pre></td></tr></table></div></figure> |
| 37 | +
|
| 38 | +
|
| 39 | +<p>Once the structure conforms to <code>Codable</code> everything works out of the box. There’s a nice way to test those structures and make sure that everything gets the exact JSON format that we aligned with backend.</p> |
| 40 | +
|
| 41 | +<!--more--> |
| 42 | +
|
| 43 | +
|
| 44 | +<p>Let’s create the following protocol in the test bundle:</p> |
| 45 | +
|
| 46 | +<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> |
| 47 | +<span class='line-number'>2</span> |
| 48 | +<span class='line-number'>3</span> |
| 49 | +<span class='line-number'>4</span> |
| 50 | +</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">protocol</span> <span class="n">JSONTestable</span> <span class="p">{</span> |
| 51 | +</span><span class='line'> <span class="k">init</span><span class="o">?</span><span class="p">(</span><span class="n">_</span> <span class="nl">json</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span> |
| 52 | +</span><span class='line'> <span class="k">func</span> <span class="n">json</span><span class="p">()</span> <span class="o">-></span> <span class="n">String</span><span class="o">?</span> |
| 53 | +</span><span class='line'><span class="p">}</span> |
| 54 | +</span></code></pre></td></tr></table></div></figure> |
| 55 | +
|
| 56 | +
|
| 57 | +<p>After that we can immediately provide an extension which conforms to that protocol in the test bundle:</p> |
| 58 | +
|
| 59 | +<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> |
| 60 | +<span class='line-number'>2</span> |
| 61 | +<span class='line-number'>3</span> |
| 62 | +<span class='line-number'>4</span> |
| 63 | +<span class='line-number'>5</span> |
| 64 | +<span class='line-number'>6</span> |
| 65 | +<span class='line-number'>7</span> |
| 66 | +<span class='line-number'>8</span> |
| 67 | +<span class='line-number'>9</span> |
| 68 | +<span class='line-number'>10</span> |
| 69 | +<span class='line-number'>11</span> |
| 70 | +<span class='line-number'>12</span> |
| 71 | +<span class='line-number'>13</span> |
| 72 | +<span class='line-number'>14</span> |
| 73 | +</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">extension</span> <span class="n">JSONTestable</span> <span class="k">where</span> <span class="nl">Self</span><span class="p">:</span> <span class="n">Codable</span> <span class="p">{</span> |
| 74 | +</span><span class='line'> <span class="k">init</span><span class="o">?</span><span class="p">(</span><span class="n">_</span> <span class="nl">json</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span> <span class="p">{</span> |
| 75 | +</span><span class='line'> <span class="n">guard</span> |
| 76 | +</span><span class='line'> <span class="k">let</span> <span class="n">data</span> <span class="o">=</span> <span class="n">json</span><span class="p">.</span><span class="n">data</span><span class="p">(</span><span class="nl">using</span><span class="p">:</span> <span class="p">.</span><span class="n">utf8</span><span class="p">),</span> |
| 77 | +</span><span class='line'> <span class="k">let</span> <span class="n">decoded</span> <span class="o">=</span> <span class="n">try</span><span class="o">?</span> <span class="n">JSONDecoder</span><span class="p">().</span><span class="n">decode</span><span class="p">(</span><span class="kt">Self</span><span class="p">.</span><span class="nb">self</span><span class="p">,</span> <span class="nl">from</span><span class="p">:</span> <span class="n">data</span><span class="p">)</span> |
| 78 | +</span><span class='line'> <span class="k">else</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">nil</span> <span class="p">}</span> |
| 79 | +</span><span class='line'> <span class="nb">self</span> <span class="o">=</span> <span class="n">decoded</span> |
| 80 | +</span><span class='line'> <span class="p">}</span> |
| 81 | +</span><span class='line'> |
| 82 | +</span><span class='line'> <span class="k">func</span> <span class="n">json</span><span class="p">()</span> <span class="o">-></span> <span class="n">String</span><span class="o">?</span> <span class="p">{</span> |
| 83 | +</span><span class='line'> <span class="n">guard</span> <span class="k">let</span> <span class="n">data</span> <span class="o">=</span> <span class="n">try</span><span class="o">?</span> <span class="n">JSONEncoder</span><span class="p">().</span><span class="n">encode</span><span class="p">(</span><span class="nb">self</span><span class="p">)</span> <span class="k">else</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">nil</span> <span class="p">}</span> |
| 84 | +</span><span class='line'> <span class="k">return</span> <span class="n">String</span><span class="p">(</span><span class="nl">data</span><span class="p">:</span> <span class="n">data</span><span class="p">,</span> <span class="nl">encoding</span><span class="p">:</span> <span class="p">.</span><span class="n">utf8</span><span class="p">)</span> |
| 85 | +</span><span class='line'> <span class="p">}</span> |
| 86 | +</span><span class='line'><span class="p">}</span> |
| 87 | +</span></code></pre></td></tr></table></div></figure> |
| 88 | +
|
| 89 | +
|
| 90 | +<p>Then there’s only one simple step which needs to be done in the test bundle in order to test the structure: |
| 91 | +<code>PersonTests.swift</code>:</p> |
| 92 | +
|
| 93 | +<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> |
| 94 | +</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">extension</span> <span class="nl">Person</span><span class="p">:</span> <span class="n">JSONTestable</span> <span class="p">{}</span> |
| 95 | +</span></code></pre></td></tr></table></div></figure> |
| 96 | +
|
| 97 | +
|
| 98 | +<p>That’s it! Now we can easily test the result of the serialization and deserialization :)</p> |
| 99 | +
|
| 100 | +<p>Example tests:</p> |
| 101 | +
|
| 102 | +<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> |
| 103 | +<span class='line-number'>2</span> |
| 104 | +<span class='line-number'>3</span> |
| 105 | +<span class='line-number'>4</span> |
| 106 | +<span class='line-number'>5</span> |
| 107 | +<span class='line-number'>6</span> |
| 108 | +<span class='line-number'>7</span> |
| 109 | +<span class='line-number'>8</span> |
| 110 | +<span class='line-number'>9</span> |
| 111 | +<span class='line-number'>10</span> |
| 112 | +<span class='line-number'>11</span> |
| 113 | +<span class='line-number'>12</span> |
| 114 | +<span class='line-number'>13</span> |
| 115 | +<span class='line-number'>14</span> |
| 116 | +<span class='line-number'>15</span> |
| 117 | +<span class='line-number'>16</span> |
| 118 | +<span class='line-number'>17</span> |
| 119 | +</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="n">final</span> <span class="k">class</span> <span class="nl">PersonTests</span><span class="p">:</span> <span class="n">XCTestCase</span> <span class="p">{</span> |
| 120 | +</span><span class='line'> <span class="k">func</span> <span class="n">testJsonSerialization</span><span class="p">()</span> <span class="p">{</span> |
| 121 | +</span><span class='line'> <span class="k">let</span> <span class="n">person</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="nl">name</span><span class="p">:</span> <span class="s">"John Appleased"</span><span class="p">,</span> <span class="nl">email</span><span class="p">:</span> <span class="s">"john@appleased.com"</span><span class="p">,</span> <span class="nl">age</span><span class="p">:</span> <span class="mi">30</span><span class="p">)</span> |
| 122 | +</span><span class='line'> <span class="n">XCTAssertEqual</span><span class="p">(</span><span class="n">personJson</span><span class="p">,</span> <span class="n">person</span><span class="p">.</span><span class="n">json</span><span class="p">())</span> <span class="c1">// ✅</span> |
| 123 | +</span><span class='line'> <span class="p">}</span> |
| 124 | +</span><span class='line'> |
| 125 | +</span><span class='line'> <span class="k">func</span> <span class="n">testJsonDeserialization</span><span class="p">()</span> <span class="p">{</span> |
| 126 | +</span><span class='line'> <span class="k">let</span> <span class="n">person</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="nl">name</span><span class="p">:</span> <span class="s">"John Appleased"</span><span class="p">,</span> <span class="nl">email</span><span class="p">:</span> <span class="s">"john@appleased.com"</span><span class="p">,</span> <span class="nl">age</span><span class="p">:</span> <span class="mi">30</span><span class="p">)</span> |
| 127 | +</span><span class='line'> <span class="n">XCTAssertEqual</span><span class="p">(</span><span class="n">person</span><span class="p">,</span> <span class="n">Person</span><span class="p">(</span><span class="n">personJson</span><span class="p">))</span> <span class="c1">// ✅</span> |
| 128 | +</span><span class='line'> <span class="p">}</span> |
| 129 | +</span><span class='line'><span class="p">}</span> |
| 130 | +</span><span class='line'> |
| 131 | +</span><span class='line'><span class="n">private</span> <span class="k">let</span> <span class="n">personJson</span> <span class="o">=</span> <span class="s">"""</span> |
| 132 | +</span><span class='line'><span class="p">{</span><span class="s">"name"</span><span class="o">:</span><span class="s">"John Appleased"</span><span class="p">,</span><span class="s">"email"</span><span class="o">:</span><span class="s">"john@appleased.com"</span><span class="p">,</span><span class="s">"age"</span><span class="o">:</span><span class="mi">30</span><span class="p">}</span> |
| 133 | +</span><span class='line'><span class="s">"""</span> |
| 134 | +</span><span class='line'> |
| 135 | +</span><span class='line'><span class="k">extension</span> <span class="nl">Person</span><span class="p">:</span> <span class="n">JSONTestable</span><span class="p">,</span> <span class="n">Equatable</span> <span class="p">{}</span> |
| 136 | +</span></code></pre></td></tr></table></div></figure> |
| 137 | +
|
| 138 | +
|
| 139 | +<p>What do you think about this method? Is there anything which could be improved in this implementation? Please let us know :)</p> |
| 140 | +]]></content> |
| 141 | + |
| 142 | + </entry> |
| 143 | + |
16 | 144 | <entry>
|
17 | 145 |
|
18 | 146 | <title type="html"><![CDATA[Testing the camera on the simulator]]></title>
|
@@ -2584,30 +2712,6 @@ We can solve those situations by using the so called <code>Symbolic Breakpoints<
|
2584 | 2712 |
|
2585 | 2713 |
|
2586 | 2714 | <p>This creates nice fade in/out animation which is exactly what we want.</p>
|
2587 |
| -]]></content> |
2588 |
| - |
2589 |
| - </entry> |
2590 |
| - |
2591 |
| - <entry> |
2592 |
| - |
2593 |
| - <title type="html"><![CDATA[Fixing UICatalog invalid asset error]]></title> |
2594 |
| - <link href="http://nshint.github.io/blog/2015/07/02/fixing-uicatalog-invalid-asset-error/"/> |
2595 |
| - |
2596 |
| - <updated>2015-07-02T17:29:00+02:00</updated> |
2597 |
| - <id>http://nshint.github.io/blog/2015/07/02/fixing-uicatalog-invalid-asset-error</id> |
2598 |
| - |
2599 |
| - <content type="html"><![CDATA[<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> |
2600 |
| -</pre></td><td class='code'><pre><code class=''><span class='line'>CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000</span></code></pre></td></tr></table></div></figure> |
2601 |
| -
|
2602 |
| -
|
2603 |
| -<p>This error may happen when you try to load <code>UIImage</code> and your asset string is <code>nil</code>. For now this will not crash your app but may case some future problems. This may also lead to some UI inconsistency. To track down issue like this we need to set symbolic breakpoint:</p> |
2604 |
| -
|
2605 |
| -<!--more--> |
2606 |
| -
|
2607 |
| -
|
2608 |
| -<p><img class="center" src="http://nshint.github.io/images/uicatalog_invalid_asset/null_asset.png"></p> |
2609 |
| -
|
2610 |
| -<p>Add <code>$arg3 == nil</code> condition (on Simulator) or <code>$r0 == nil</code> condition on iPhone device. This will stop executing your app exactly in the line where you try to load broken image.</p> |
2611 | 2715 | ]]></content>
|
2612 | 2716 |
|
2613 | 2717 | </entry>
|
|
0 commit comments