-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtesting.html
313 lines (296 loc) · 18.3 KB
/
testing.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
<!DOCTYPE html>
<html lang="en">
<head>
<title>Testing Reference</title>
<link rel="stylesheet" type="text/css" href="css/jazzy.css" />
<link rel="stylesheet" type="text/css" href="css/highlight.css" />
<meta charset='utf-8'>
<script src="js/jquery.min.js" defer></script>
<script src="js/jazzy.js" defer></script>
</head>
<body>
<a title="Testing Reference"></a>
<header>
<div class="content-wrapper">
<p><a href="index.html">Moya Docs</a> (82% documented)</p>
</div>
</header>
<div class="content-wrapper">
<p id="breadcrumbs">
<a href="index.html">Moya Reference</a>
<img id="carat" src="img/carat.png" />
Testing Reference
</p>
</div>
<div class="content-wrapper">
<nav class="sidebar">
<ul class="nav-groups">
<li class="nav-group-name">
<a href="Guides.html">Guides</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="authentication.html">Authentication</a>
</li>
<li class="nav-group-task">
<a href="communityprojects.html">CommunityProjects</a>
</li>
<li class="nav-group-task">
<a href="endpoints.html">Endpoints</a>
</li>
<li class="nav-group-task">
<a href="plugins.html">Plugins</a>
</li>
<li class="nav-group-task">
<a href="providers.html">Providers</a>
</li>
<li class="nav-group-task">
<a href="readme.html">README</a>
</li>
<li class="nav-group-task">
<a href="reactiveswift.html">ReactiveSwift</a>
</li>
<li class="nav-group-task">
<a href="releasing.html">Releasing</a>
</li>
<li class="nav-group-task">
<a href="rxswift.html">RxSwift</a>
</li>
<li class="nav-group-task">
<a href="targets.html">Targets</a>
</li>
<li class="nav-group-task">
<a href="testing.html">Testing</a>
</li>
<li class="nav-group-task">
<a href="threading.html">Threading</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Classes.html">Classes</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Classes/CancellableToken.html">CancellableToken</a>
</li>
<li class="nav-group-task">
<a href="Classes/CredentialsPlugin.html">CredentialsPlugin</a>
</li>
<li class="nav-group-task">
<a href="Classes/Endpoint.html">Endpoint</a>
</li>
<li class="nav-group-task">
<a href="Classes/MoyaProvider.html">MoyaProvider</a>
</li>
<li class="nav-group-task">
<a href="Classes/NetworkActivityPlugin.html">NetworkActivityPlugin</a>
</li>
<li class="nav-group-task">
<a href="Classes/NetworkLoggerPlugin.html">NetworkLoggerPlugin</a>
</li>
<li class="nav-group-task">
<a href="Classes/NetworkLoggerPlugin/Configuration.html">– Configuration</a>
</li>
<li class="nav-group-task">
<a href="Classes/Response.html">Response</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Enums.html">Enumerations</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Enums/AuthorizationType.html">AuthorizationType</a>
</li>
<li class="nav-group-task">
<a href="Enums/EndpointSampleResponse.html">EndpointSampleResponse</a>
</li>
<li class="nav-group-task">
<a href="Enums/MoyaError.html">MoyaError</a>
</li>
<li class="nav-group-task">
<a href="Enums/MultiTarget.html">MultiTarget</a>
</li>
<li class="nav-group-task">
<a href="Enums/NetworkActivityChangeType.html">NetworkActivityChangeType</a>
</li>
<li class="nav-group-task">
<a href="Enums/StubBehavior.html">StubBehavior</a>
</li>
<li class="nav-group-task">
<a href="Enums/Task.html">Task</a>
</li>
<li class="nav-group-task">
<a href="Enums/ValidationType.html">ValidationType</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Extensions.html">Extensions</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Extensions/Method.html">Method</a>
</li>
<li class="nav-group-task">
<a href="Extensions/Request.html">Request</a>
</li>
<li class="nav-group-task">
<a href="Extensions/URL.html">URL</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Functions.html">Functions</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Functions.html#/s:4Moya23convertResponseToResult_7request4data5errors0E0OyAA0C0CAA0A5ErrorOGSo17NSHTTPURLResponseCSg_10Foundation10URLRequestVSgAP4DataVSgs0I0_pSgtF">convertResponseToResult(_:request:data:error:)</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Protocols.html">Protocols</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Protocols/AccessTokenAuthorizable.html">AccessTokenAuthorizable</a>
</li>
<li class="nav-group-task">
<a href="Protocols/Cancellable.html">Cancellable</a>
</li>
<li class="nav-group-task">
<a href="Protocols/MoyaProviderType.html">MoyaProviderType</a>
</li>
<li class="nav-group-task">
<a href="Protocols/PluginType.html">PluginType</a>
</li>
<li class="nav-group-task">
<a href="Protocols/RequestType.html">RequestType</a>
</li>
<li class="nav-group-task">
<a href="Protocols/TargetType.html">TargetType</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Structs.html">Structures</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Structs/AccessTokenPlugin.html">AccessTokenPlugin</a>
</li>
<li class="nav-group-task">
<a href="Structs/MultipartFormData.html">MultipartFormData</a>
</li>
<li class="nav-group-task">
<a href="Structs/MultipartFormData/FormDataProvider.html">– FormDataProvider</a>
</li>
<li class="nav-group-task">
<a href="Structs/ProgressResponse.html">ProgressResponse</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Typealiases.html">Type Aliases</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya10Completiona">Completion</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya19DownloadDestinationa">DownloadDestination</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya5Imagea">Image</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/ImageType">ImageType</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya9ImageTypea">ImageType</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya12JSONEncodinga">JSONEncoding</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya6Methoda">Method</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya17ParameterEncodinga">ParameterEncoding</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya13ProgressBlocka">ProgressBlock</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya18RequestInterceptora">RequestInterceptor</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya24RequestMultipartFormDataa">RequestMultipartFormData</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya7Sessiona">Session</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya11URLEncodinga">URLEncoding</a>
</li>
</ul>
</li>
</ul>
</nav>
<article class="main-content">
<section>
<section class="section">
<h1 id='testing' class='heading'>Testing</h1>
<p>Moya has been created with testing at its heart. In this document, you will find all the customization points that will allow you to tailor your testing.</p>
<h2 id='code-sampledata-code' class='heading'><code>sampleData</code></h2>
<p>When creating your <code><a href="Protocols/TargetType.html">TargetType</a></code> you are required to provide <code>sampleData</code> for your targets. All you need to do there is to provide <code>Data</code> that represents a sample response from every particular target. This can be used later for tests or just for providing offline support while developing. </p>
<p>For example:</p>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="k">var</span> <span class="nv">sampleData</span><span class="p">:</span> <span class="kt">Data</span> <span class="p">{</span>
<span class="k">switch</span> <span class="k">self</span> <span class="p">{</span>
<span class="k">case</span> <span class="o">.</span><span class="nf">userRepositories</span><span class="p">(</span><span class="k">let</span> <span class="nv">name</span><span class="p">):</span>
<span class="k">return</span> <span class="s">"[{</span><span class="se">\"</span><span class="s">name</span><span class="se">\"</span><span class="s">: </span><span class="se">\"</span><span class="s">Repo Name</span><span class="se">\"</span><span class="s">}]"</span><span class="o">.</span><span class="nf">data</span><span class="p">(</span><span class="nv">using</span><span class="p">:</span> <span class="kt">String</span><span class="o">.</span><span class="kt">Encoding</span><span class="o">.</span><span class="n">utf8</span><span class="p">)</span><span class="o">!</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
<h2 id='code-stubclosure-code' class='heading'><code>stubClosure</code></h2>
<p>The <code>stubClosure</code> property of a <code><a href="Classes/MoyaProvider.html">MoyaProvider</a></code> is responsible for configuring whether a provider returns an actual or a stubbed response. This configuration is made in this closure by mapping a <code><a href="Protocols/TargetType.html">TargetType</a></code> to a case of the <code><a href="Enums/StubBehavior.html">StubBehavior</a></code> enum:</p>
<ul>
<li><code>.never</code> to not stub responses.</li>
<li><code>.immediate</code> to stub responses immediately.</li>
<li><code>.delayed(seconds: TimeInterval)</code> to stub responses after a given delay (to simulate the delays the real network calls may have).</li>
</ul>
<p>For your convenience, <code><a href="Classes/MoyaProvider.html">MoyaProvider</a></code> defines the <code>.immediatelyStub</code> and <code>.delayedStub(:)</code> closures that you can set while initializing your provider to always stub responses immediately or with a given delay. For example, in the following provider <em>all</em> your requests are going to receive <em>immediate</em> responses with your <code>sampleData</code>. </p>
<pre class="highlight swift"><code><span class="k">let</span> <span class="nv">stubbingProvider</span> <span class="o">=</span> <span class="kt">MoyaProvider</span><span class="o"><</span><span class="kt">GitHub</span><span class="o">></span><span class="p">(</span><span class="nv">stubClosure</span><span class="p">:</span> <span class="kt">MoyaProvider</span><span class="o">.</span><span class="n">immediatelyStub</span><span class="p">)</span>
</code></pre>
<p>Before you continue, it is worth mentioning that all the stubbed responses will be delivered with an HTTP status <code>200</code> by default.</p>
<h2 id='code-sampleresponseclosure-code' class='heading'><code>sampleResponseClosure</code></h2>
<p>With the previous <code>sampleData</code> and <code>stubClosure</code>, we could only specify the data returned when stubbing. But you have more options.</p>
<p>Moya offers you the opportunity to configure an <code>endpointClosure</code> on your provider. In this closure, your <code>Target</code> needs to be mapped to an <code><a href="Classes/Endpoint.html">Endpoint</a></code>. <code><a href="Classes/Endpoint.html">Endpoint</a></code> is a semi-internal data structure used by Moya to reason about the request. And in this <code><a href="Classes/Endpoint.html">Endpoint</a></code> is where you are going to be able to specify more details for your testing. More concretely, on its <code>sampleResponseClosure</code>.</p>
<p>As we discussed above, the default stubbing behavior is to respond to requests with your sample data with a <code>200</code> HTTP status code. This is because the default <code>endpointClosure</code> defines its <code>sampleResponseClosure</code> as follows:</p>
<pre class="highlight swift"><code><span class="p">{</span> <span class="o">.</span><span class="nf">networkResponse</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span> <span class="n">target</span><span class="o">.</span><span class="n">sampleData</span><span class="p">)</span> <span class="p">}</span>
</code></pre>
<p>If you need to setup your own <code>sampleResponseClosure</code>, your implementation should return a case of the <code><a href="Enums/EndpointSampleResponse.html">EndpointSampleResponse</a></code> enum:</p>
<ul>
<li>A <code>.networkResponse(Int, Data)</code> where <code>Int</code> is a status code and <code>Data</code> is the returned data.
Useful to customize either response codes or data to your own specification.</li>
<li>A <code>.response(HTTPURLResponse, Data)</code> where <code>HTTPURLResponse</code> is the response and <code>Data</code> is the returned data.
Useful to <em>fully</em> stub your responses.</li>
<li>A <code>.networkError(NSError)</code> where <code>NSError</code> is the error that occurred when sending the request or retrieving a response.
Useful to test for any network errors: Timeouts, reachability issues, etc.</li>
</ul>
<p>For example, the following code creates a provider to stub with <em>immediate</em> <code>401</code> responses:</p>
<pre class="highlight swift"><code><span class="k">let</span> <span class="nv">customEndpointClosure</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">target</span><span class="p">:</span> <span class="kt">APIService</span><span class="p">)</span> <span class="o">-></span> <span class="kt">Endpoint</span> <span class="k">in</span>
<span class="k">return</span> <span class="kt">Endpoint</span><span class="p">(</span><span class="nv">url</span><span class="p">:</span> <span class="kt">URL</span><span class="p">(</span><span class="nv">target</span><span class="p">:</span> <span class="n">target</span><span class="p">)</span><span class="o">.</span><span class="n">absoluteString</span><span class="p">,</span>
<span class="nv">sampleResponseClosure</span><span class="p">:</span> <span class="p">{</span> <span class="o">.</span><span class="nf">networkResponse</span><span class="p">(</span><span class="mi">401</span> <span class="p">,</span> <span class="cm">/* data relevant to the auth error */</span><span class="p">)</span> <span class="p">},</span>
<span class="nv">method</span><span class="p">:</span> <span class="n">target</span><span class="o">.</span><span class="n">method</span><span class="p">,</span>
<span class="nv">task</span><span class="p">:</span> <span class="n">target</span><span class="o">.</span><span class="n">task</span><span class="p">,</span>
<span class="nv">httpHeaderFields</span><span class="p">:</span> <span class="n">target</span><span class="o">.</span><span class="n">headers</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">let</span> <span class="nv">stubbingProvider</span> <span class="o">=</span> <span class="kt">MoyaProvider</span><span class="o"><</span><span class="kt">GitHub</span><span class="o">></span><span class="p">(</span><span class="nv">endpointClosure</span><span class="p">:</span> <span class="n">customEndpointClosure</span><span class="p">,</span> <span class="nv">stubClosure</span><span class="p">:</span> <span class="kt">MoyaProvider</span><span class="o">.</span><span class="n">immediatelyStub</span><span class="p">)</span>
</code></pre>
</section>
</section>
<section id="footer">
<p>© 2020 <a class="link" href="https://github.com/Moya/Moya" target="_blank" rel="external">Ash Furrow</a>. All rights reserved. (Last updated: 2020-02-24)</p>
<p>Generated by <a class="link" href="https://github.com/realm/jazzy" target="_blank" rel="external">jazzy ♪♫ v0.9.6</a>, a <a class="link" href="https://realm.io" target="_blank" rel="external">Realm</a> project.</p>
</section>
</article>
</div>
</body>
</div>
</html>