forked from rspec/rspec.github.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
703 lines (556 loc) · 44.3 KB
/
index.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
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
<!DOCTYPE html>
<!--[if lt IE 7]><html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en"><![endif]-->
<!--[if IE 7]><html class="no-js lt-ie9 lt-ie8" lang="en"><![endif]-->
<!--[if IE 8]><html class="no-js lt-ie9" lang="en"><![endif]-->
<!--[if gt IE 8]<!--><html class="no-js" lang="en"><!--<![endif]--><head><meta charset="UTF-8" /><meta content="width=device-width, initial-scale=1" name="viewport" /><meta content="RSpec 3.5 がリリースされました!" property="og:title" /><meta content="https://rspec.info/ja/blog/2016/07/rspec-3-5-has-been-released/" property="og:url" /><meta content="https://rspec.info/images/logo_ogp.png" property="og:image" /><meta content="summary" name="twitter:card" /><meta content="@rspec" name="twitter:site" /><title>RSpec 3.5 がリリースされました!</title><link href="/stylesheets/pages/blog.css" rel="stylesheet" type="text/css" /><link href="https://fonts.googleapis.com/css?family=Montserrat:400,700" rel="stylesheet" type="text/css" /><link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro" rel="stylesheet" type="text/css" /><link href="https://fonts.googleapis.com/css?family=Inconsolata" rel="stylesheet" type="text/css" /><link href="/blog/feed.xml" rel="alternate" type="application/atom+xml" /></head><body class="blog"><header><nav><h1><img alt="Logo" src="/images/logo.png" /><a href="/">RSpec</a></h1><input class="hamburger-toggle" type="checkbox" /><div class="hamburger-icon"><div class="bar"></div><div class="bar"></div><div class="bar"></div></div><ul class="menu"><li><a href="/about">About</a></li><li><a href="/documentation">Documentation</a></li><li><a href="/blog">Blog</a></li><li><a href="/upgrading-from-rspec-2">Upgrade</a></li><li><a href="/help">Get Help</a></li><li><a href="/contributing">Contributing</a></li></ul></nav></header><section><article class="blog_post"><ul class="langs"><li class="lang"><a href="/blog/2016/07/rspec-3-5-has-been-released/">en</a></li><li class="lang current_lang">ja</li></ul><h1>RSpec 3.5 がリリースされました!</h1><h3 class="author">Sam Phippen, Myron Marston, Jon Rowe and Yuji Nakayama</h3><small class="date">Jul 1, 2016</small><p>RSpec 3.5 がリリースされました!
私たちは <a href="http://semver.org/">semantic versioning</a> に準拠する方針を掲げているため、
このリリースはすでに RSpec 3 を使っている方にとってなにか対応が必要になるものではありません。
しかし、もし私たちがバグを作り込んでしまっていた場合は教えてください。
できるだけ早く修正をし、パッチ版をリリースします。</p>
<p>RSpec は世界中のコントリビュータと共に、コミュニティ主導のプロジェクトであり続けます。
今回のリリースには、50 人以上のコントリビュータによる 600 以上のコミットと 150 以上の pull request が含まれています!</p>
<p>このリリースに向けて力になってくれたみなさん、ありがとう!</p>
<h2 id="section">主要な変更</h2>
<h3 id="core-configwhenfirstmatchingexampledefined">Core: <code>config.when_first_matching_example_defined</code></h3>
<p>私たちは基本的に、
一部の spec でしか使わないセットアップロジックは <code>spec_helper.rb</code> には書かないようにすることをおすすめしています。
そうすることで、単独の spec を実行する際の起動時間を短縮できるからです。
そういったセットアップロジックは <code>spec/support</code> ディレクトリに入れると良いでしょう。
そしてそれを必要とする spec ファイルで、まずサポートファイルを require し、example group にタグをつけることで、
関連付けられたフックやモジュールを include することができます。</p>
<div class="highlight"><pre class="highlight ruby"><code><span class="nb">require</span> <span class="s1">'support/db'</span>
<span class="no">RSpec</span><span class="p">.</span><span class="nf">describe</span> <span class="no">SomeClassThatUsesTheDB</span><span class="p">,</span> <span class="ss">:db</span> <span class="k">do</span>
<span class="c1"># ...</span>
<span class="k">end</span>
</code></pre></div>
<p>この方法は上手くいきます。しかし、require と <code>:db</code> タグの両方が必要になるのは最適な方法ではないかもしれません。
その DB を利用するすべての spec において、毎回重複が発生してしまうからです。
また、もしその DB を使う spec に <code>require 'support/db'</code> を書き忘れてしまった場合、
その spec ファイル単体で実行すると失敗するけれども、
すべての spec を実行した場合にはパスする、
というような状況が起こりえます(他の spec ファイルがサポートファイルを読み込むので)。</p>
<p>RSpec 3.5 では、こういった状況で上手く使える新しいフックを導入しました。
<code>support/db</code> を必要とするすべての spec ファイルでそれを require する代わりに、
<code>:db</code> タグがついた example が定義されたタイミングでそれを自動的に読み込むように設定できます。</p>
<div class="highlight"><pre class="highlight ruby"><code><span class="no">RSpec</span><span class="p">.</span><span class="nf">configure</span> <span class="k">do</span> <span class="o">|</span><span class="n">config</span><span class="o">|</span>
<span class="n">config</span><span class="p">.</span><span class="nf">when_first_matching_example_defined</span><span class="p">(</span><span class="ss">:db</span><span class="p">)</span> <span class="k">do</span>
<span class="nb">require</span> <span class="s1">'support/db'</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre></div>
<p>この新しい <code>when_first_matching_example_defined</code> フックは、
一致するメタデータを持つ最初の example が定義されたタイミングで発火し、
メタデータを基に必要なものを読み込むように設定できます。
もちろん、この仕組みは他にもいろいろな使い道があると思いますが、
これが私たちの想定している主なユースケースの一つです。</p>
<h3 id="core-configfilterrunwhenmatching">Core: <code>config.filter_run_when_matching</code></h3>
<p>RSpec のメタデータの一般的な使い方の一つとして、focus フィルタがあります。
RSpec 3.5 以前では、このように focus フィルタを設定していたでしょう。</p>
<div class="highlight"><pre class="highlight ruby"><code><span class="no">RSpec</span><span class="p">.</span><span class="nf">configure</span> <span class="k">do</span> <span class="o">|</span><span class="n">config</span><span class="o">|</span>
<span class="n">config</span><span class="p">.</span><span class="nf">filter_run</span> <span class="ss">:focus</span>
<span class="n">config</span><span class="p">.</span><span class="nf">run_all_when_everything_filtered</span> <span class="o">=</span> <span class="kp">true</span>
<span class="k">end</span>
</code></pre></div>
<p>そして、example か example group に <code>:focus</code> タグをつけることで、RSpec にそれらのみを実行させることができます。
<code>run_all_when_everything_filtered = true</code> オプションは、
<code>:focus</code> タグがついたものが何もない場合に RSpec にこのフィルタを無視させるために使います。</p>
<p>しかしながら、<code>run_all_when_everything_filtered</code> は(<code>:focus</code> フィルタだけでなく)
<em>すべての</em> フィルタに適用されるため、場合によっては予想外の挙動が発生してしまうことがあります
(例えば<a href="https://github.com/rspec/rspec-core/issues/1920">この issue</a>)。
この問題に関して、私たちは <code>:focus</code> を <em>条件付きの</em> フィルタとしてセットアップできれば上手くいくと考え、
RSpec 3.5 では以下のように設定できるようにしました。</p>
<div class="highlight"><pre class="highlight ruby"><code><span class="no">RSpec</span><span class="p">.</span><span class="nf">configure</span> <span class="k">do</span> <span class="o">|</span><span class="n">config</span><span class="o">|</span>
<span class="n">config</span><span class="p">.</span><span class="nf">filter_run_when_matching</span> <span class="ss">:focus</span>
<span class="k">end</span>
</code></pre></div>
<p>この設定を使うと、<code>:focus</code> タグのついた example か example group が一つ以上存在する場合にのみ、
<code>:focus</code> フィルタが有効になります。また、以前より短く、シンプルな設定になります!</p>
<h3 id="core--spec-">Core: コマンドラインで指定された順番で spec ファイルを読み込むように</h3>
<p>RSpec 3.5 では、コマンドライン引数で渡された順番で spec ファイルやディレクトリを読み込むようになりました。
これによって、その場で簡単に順序を指定することができるようになります。
例えばその場で一度だけ、高速なユニット spec を、時間のかかる受け入れ spec の前に実行したいという場合、
このように RSpec を実行します。</p>
<div class="highlight"><pre class="highlight plaintext"><code>$ rspec spec/unit spec/acceptance --order defined
</code></pre></div>
<p>この <code>--order defined</code> オプションは、
あなたのプロジェクトでデフォルトの実行順序をランダムに設定(推奨)している場合にのみ必要になります。</p>
<h3 id="core-shared-example-group--include-">Core: Shared example group の include 方式の変更</h3>
<p>これまで RSpec は shared context という概念
(任意のコンテキスト用のヘルパーメソッドやフックを共通化するための shared example group)
をサポートしてきました。
Shared context はこんな風に定義します。</p>
<div class="highlight"><pre class="highlight ruby"><code><span class="no">RSpec</span><span class="p">.</span><span class="nf">shared_context</span> <span class="s2">"DB support"</span> <span class="k">do</span>
<span class="n">let</span><span class="p">(</span><span class="ss">:db</span><span class="p">)</span> <span class="p">{</span> <span class="no">MyORM</span><span class="p">.</span><span class="nf">database</span> <span class="p">}</span>
<span class="c1"># それぞれの example をトランザクションで囲う</span>
<span class="n">around</span> <span class="k">do</span> <span class="o">|</span><span class="n">ex</span><span class="o">|</span>
<span class="n">db</span><span class="p">.</span><span class="nf">transaction</span><span class="p">(</span><span class="ss">:rollback</span> <span class="o">=></span> <span class="ss">:always</span><span class="p">,</span> <span class="o">&</span><span class="n">ex</span><span class="p">)</span>
<span class="k">end</span>
<span class="c1"># SQL 文がどの example から発行されたのかわかるように</span>
<span class="c1"># 開始/終了メッセージを DB のログに出力する</span>
<span class="n">before</span> <span class="k">do</span> <span class="o">|</span><span class="n">ex</span><span class="o">|</span>
<span class="n">db</span><span class="p">.</span><span class="nf">logger</span><span class="p">.</span><span class="nf">info</span> <span class="s2">"Beginning example: </span><span class="si">#{</span><span class="n">ex</span><span class="p">.</span><span class="nf">metadata</span><span class="p">[</span><span class="ss">:full_description</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
<span class="n">after</span> <span class="k">do</span> <span class="o">|</span><span class="n">ex</span><span class="o">|</span>
<span class="n">db</span><span class="p">.</span><span class="nf">logger</span><span class="p">.</span><span class="nf">info</span> <span class="s2">"Ending example: </span><span class="si">#{</span><span class="n">ex</span><span class="p">.</span><span class="nf">metadata</span><span class="p">[</span><span class="ss">:full_description</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre></div>
<p>この shared context を使うには、任意の example group で <code>include_context</code> を使って include します。</p>
<div class="highlight"><pre class="highlight ruby"><code><span class="no">RSpec</span><span class="p">.</span><span class="nf">describe</span> <span class="no">MyModel</span> <span class="k">do</span>
<span class="n">include_context</span> <span class="s2">"DB support"</span>
<span class="k">end</span>
</code></pre></div>
<p>また、 メタデータによって <em>暗黙的に</em> shared context を include する方法もあります。</p>
<div class="highlight"><pre class="highlight ruby"><code><span class="no">RSpec</span><span class="p">.</span><span class="nf">shared_context</span> <span class="s2">"DB support"</span><span class="p">,</span> <span class="ss">:db</span> <span class="k">do</span>
<span class="c1"># ...</span>
<span class="k">end</span>
<span class="c1"># ...</span>
<span class="no">RSpec</span><span class="p">.</span><span class="nf">describe</span> <span class="no">MyModel</span><span class="p">,</span> <span class="ss">:db</span> <span class="k">do</span>
<span class="c1"># ...</span>
<span class="k">end</span>
</code></pre></div>
<p>この方法はまあまあ上手くいきます。しかし、いくつかの問題がありました。</p>
<ul>
<li><code>shared_context</code> の第一引数(<code>"DB support"</code>)は、そのグループが何のためのものかというラベルでしかない(コメントと大差ない)。</li>
<li>メタデータが shared example group の場合だけ特別に扱われ、通常の example group のように単純にそのグループに適用されない、
という挙動に対して、予想外だという意見がこれまで挙がってきていた。</li>
<li>Shared example group を include した側の example group に対して自動的に適用されるようなメタデータを付与することが不可能だった。
例えば、一時的に <code>:skip</code> や <code>:focus</code> メタデータを、include した側の example group に自動的に適用する、ということができない。</li>
<li>Shared example group を、すべての example group に自動的に include する明確な方法がなかった
(例えば、グローバルな <code>before</code> フックや <code>let</code> をあらゆる場所で利用可能にするなど)。</li>
<li>モジュールの include 方式と一貫性がなかった(例: <code>config.include DBSupport, :db</code>)。</li>
</ul>
<p>RSpec 3.5 では、いくつかの変更によってこれらの問題に対処しました。</p>
<h4 id="api-configincludecontext">新しい API: <code>config.include_context</code></h4>
<p><code>RSpec.configure</code> ブロック内で、shared context の include 定義ができるようになりました。</p>
<div class="highlight"><pre class="highlight ruby"><code><span class="no">RSpec</span><span class="p">.</span><span class="nf">configure</span> <span class="k">do</span> <span class="o">|</span><span class="n">config</span><span class="o">|</span>
<span class="n">config</span><span class="p">.</span><span class="nf">include_context</span> <span class="s2">"DB support"</span><span class="p">,</span> <span class="ss">:db</span>
<span class="k">end</span>
</code></pre></div>
<p>これは、モジュールを include するための既存の <code>config.include</code> API と一貫しており、
メタデータを基に shared context を include するためのわかりやすい方法を提供します。
さらに、shared context をすべての example group に include することもできます(メタデータ引数を省略すれば良いだけ)。</p>
<h4 id="configsharedcontextmetadatabehavior">新しい設定: <code>config.shared_context_metadata_behavior</code></h4>
<p>Shared context のメタデータの挙動を変更するための設定も追加されました。</p>
<div class="highlight"><pre class="highlight ruby"><code><span class="no">RSpec</span><span class="p">.</span><span class="nf">configure</span> <span class="k">do</span> <span class="o">|</span><span class="n">config</span><span class="o">|</span>
<span class="n">config</span><span class="p">.</span><span class="nf">shared_context_metadata_behavior</span> <span class="o">=</span> <span class="ss">:trigger_inclusion</span>
<span class="c1"># または</span>
<span class="n">config</span><span class="p">.</span><span class="nf">shared_context_metadata_behavior</span> <span class="o">=</span> <span class="ss">:apply_to_host_groups</span>
<span class="k">end</span>
</code></pre></div>
<p>前者(<code>:trigger_inclusion</code>)はデフォルトの挙動であり、後方互換性のためだけに存在しています。
この場合、<code>RSpec.shared_context</code> に渡されたメタデータは
RSpec 3.4 までと同様
(shared example group が、一致するメタデータを持つ example group に include されるように)に扱われます。
この挙動は RSpec 4 で廃止する予定です。</p>
<p>後者(<code>:apply_to_host_groups</code>)は、新しい挙動を有効にするためのものです。
この場合、<code>RSpec.shared_context</code> に渡されたメタデータは、
include した側の example group に適用されるようになります。
例えば DB shared context に <code>:focus</code> タグをつけることによって、
それに依存するすべての example group のみを実行することができます。</p>
<div class="highlight"><pre class="highlight ruby"><code><span class="no">RSpec</span><span class="p">.</span><span class="nf">shared_context</span> <span class="s2">"DB support"</span><span class="p">,</span> <span class="ss">:focus</span> <span class="k">do</span>
<span class="c1"># ...</span>
<span class="k">end</span>
</code></pre></div>
<h3 id="expectations-respondto-">Expectations: <code>respond_to</code> マッチャのキーワード引数サポート</h3>
<p>キーワード引数が Ruby の安定した言語機能となってしばらく経ちましたが、
これまで RSpec の多くのマッチャにおいて、キーワード引数に対するエクスペクテーションを設定することができませんでした。</p>
<p>rspec-expectations 3.5 では、
オブジェクトが任意のメソッドに応答するかどうかを、キーワード引数を使って検証できるようになりました。
メソッドが任意のキーワード引数を受け取るかどうかや、通常引数のカウントを検証することができます。</p>
<div class="highlight"><pre class="highlight ruby"><code><span class="n">expect</span><span class="p">(</span><span class="n">my_object</span><span class="p">).</span><span class="nf">to</span> <span class="n">respond_to</span><span class="p">(</span><span class="ss">:find</span><span class="p">).</span><span class="nf">with_keywords</span><span class="p">(</span><span class="ss">:limit</span><span class="p">,</span> <span class="ss">:offset</span><span class="p">)</span>
<span class="n">expect</span><span class="p">(</span><span class="n">my_object</span><span class="p">).</span><span class="nf">to</span> <span class="n">respond_to</span><span class="p">(</span><span class="ss">:find</span><span class="p">).</span><span class="nf">with</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="nf">argument</span><span class="p">.</span><span class="nf">and_keywords</span><span class="p">(</span><span class="ss">:limit</span><span class="p">,</span> <span class="ss">:offset</span><span class="p">)</span>
</code></pre></div>
<p>さらに、幅のある引数カウントや、無限に引数を受け取れるかどうかも検証できます。</p>
<div class="highlight"><pre class="highlight ruby"><code><span class="n">expect</span><span class="p">(</span><span class="n">my_object</span><span class="p">).</span><span class="nf">to</span> <span class="n">respond_to</span><span class="p">(</span><span class="ss">:build</span><span class="p">).</span><span class="nf">with</span><span class="p">(</span><span class="mi">2</span><span class="o">..</span><span class="mi">3</span><span class="p">).</span><span class="nf">arguments</span>
<span class="n">expect</span><span class="p">(</span><span class="n">my_object</span><span class="p">).</span><span class="nf">to</span> <span class="n">respond_to</span><span class="p">(</span><span class="ss">:build</span><span class="p">).</span><span class="nf">with_unlimited_arguments</span>
</code></pre></div>
<p>これを実装してくれた Rob Smith、ありがとう。</p>
<h3 id="expectations-minitest-56-">Expectations: Minitest 5.6+ のサポート</h3>
<p>rspec-expectations は通常、rspec-core と一緒に使われますが、
他のテストフレームワークで使うことも簡単にできます。
Minitest とのインテグレーションも提供しており、
Minitest 自身を読み込んだ後に rspec-expectations の Minitest サポートを読み込むことで利用できます。</p>
<div class="highlight"><pre class="highlight ruby"><code><span class="nb">require</span> <span class="s1">'rspec/expectations/minitest_integration'</span>
</code></pre></div>
<p>しかし Minitest は、バージョン 5.6 においてそれ自身の <code>expect</code> メソッドを導入したため、
RSpec の <code>expect</code> と衝突し、このインテグレーションが壊れてしまいました。
rspec-expectations 3.5 にはこのための修正が含まれています。</p>
<h3 id="mocks-minitest-">Mocks: Minitest インテグレーションの追加</h3>
<p>私たちは以前から rspec-expectations の Minitest インテグレーションを提供していましたが、
rspec-mocks に関しては同レベルの簡単なインテグレーションを提供してきませんでした。
そのため、これまでユーザーは rspec-mocks のライフサイクルフックを使って Minitest と統合する必要がありました。
これは Minitest 5.6 で前述の <code>expect</code> メソッドが追加され、それによって動作が壊れるまでは問題なく動いていました。
rspec-mock 3.5 では、ファーストクラスの Minitest サポートを提供します。
これを利用するには、ただインテグレーションファイルを require するだけです。</p>
<div class="highlight"><pre class="highlight ruby"><code><span class="nb">require</span> <span class="s1">'rspec/mocks/minitest_integration'</span>
</code></pre></div>
<h3 id="rails-rails-5-">Rails: Rails 5 のサポート</h3>
<p>今回の重大ニュースは、RSpec 3.5.0 が Rails 5 をサポートしたという点です。
私たちは、Rails 5 のベータや RC がリリースされると共に、並行して RSpec 3.5.0 のベータをリリースしてきました。
これは Rails のメジャーリリースなため、RSpec が使っているいくつかの API が deprecared 扱いになりましたが、
RSpec 3.5 はメジャーリリースではなく、私たちのユーザーに影響するのはコントローラーテストのみです。</p>
<p><a href="https://github.com/rails/rails/issues/18950">Rails 5</a> では、
<code>assigns</code> と <code>assert_template</code> が soft deprecated になりました。
コントローラーテスト自身は deprecated <em>にはなっておらず</em>、
<code>:type => controller</code> メタデータを spec に指定するのは未だ完全にサポートされています。
Rails 3 と 4 において、controller spec の <code>assigns</code> は慣用されてきました。
今回の RSpec 3.5 はマイナーリリースであり、私たちは SemVer に準拠する以上、
既存の controller spec を壊さないようにしています。
既存の Rails アプリケーションで <code>assigns</code> を多用しているものについては、
<a href="https://github.com/rails/rails-controller-testing"><code>rails-controller-testing</code></a> gem
を Gemfile に追加することで <code>assigns</code> と <code>assert_template</code> を復活させることができます。
RSpec はこの gem とシームレスに連携するため、controller spec は問題なく動作し続けるはずです。</p>
<p>これから新しく作成する Rails アプリケーションについては、
<code>rails-controller-testing</code> gem を追加するのはおすすめしません。
Rails チームや RSpec コアチームとしては、代わりに
<a href="https://www.relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec">request spec</a>
を書くことを推奨します。
Request spec は一つのコントローラーアクションにフォーカスしますが、
controller spec とは違い、ルーターやミドルウェアスタック、Rack リクエストやレスポンスも関与します。
これによって、より現実に近い環境でテストを実行し、controller spec で発生しがちな多くの問題を避けることができます。
Rails 5 では、request spec が Rails 4までの request spec や controller spec よりもかなり高速になっています。
これは Rails チームの <a href="https://twitter.com/eileencodes">Eileen Uchitelle</a><sup id="fnref:foot_1"><a href="#fn:foot_1" class="footnote">1</a></sup> のおかげです。</p>
<p>他の Rails 5 の重要な機能としては ActionCable があります。
残念ながら、RSpec は今のところ ActionCable をちゃんとテストするための方法を提供できていません。
Rails 側では、Rails 5.1 でリリース予定の ActionCable のための新しいテストタイプに取り組んでいます。
私たちは常にそれを注視し、準備ができた時には RSpec 側でも取り掛かる予定です。
それまでの間は、統合テスト的にブラウザー経由で ActionCable をテストすることをおすすめします。</p>
<p>Rails 5 の成果には RSpec コアチームメンバーによる貢献が含まれており、
また私たちも Rails コアチームに大きく助けられました。
このリリースに向けて力になってくれたみなさんに感謝します。</p>
<h2 id="stats">Stats</h2>
<h3 id="combined">Combined:</h3>
<ul>
<li><strong>Total Commits</strong>: 625</li>
<li><strong>Merged pull requests</strong>: 192</li>
<li><strong>62 contributors</strong>: Aaron Stone, Ahmed AbouElhamayed, Al Snow, Alex Altair,
Alexander Skiba, Alireza Bashiri, Andrew Kozin (aka nepalez), Andrew White,
Anton Rieder, Ben Saunders, Benjamin Quorning, Bradley Schaefer, Bruno Bonamin,
DarthSim, David Rodríguez, Diogo Benicá, Eliot Sykes, Fernando Seror, Gautam
Sawhney, Isaac Betesh, James Coleman, Joe Rafaniello, John Schroeder, Jon Moss,
Jon Rowe, Jun Aruga, Kilian Cirera Sant, Koen Punt, Liss McCabe, Marc Ignacio,
Martin Emde, Matt Jones, Michele Piccirillo, Miklos Fazekas, Myron Marston,
Patrik Wenger, Perry Smith, Peter Swan, Prem Sichanugrist, Rob, Rob Smith, Ryan
Beckman, Ryan Clark, Sam Phippen, Scott Bronson, Sergey Pchelintsev, Simon
Coffey, Thomas Hart II, Timo Schilling, Tobias Bühlmann, Travis Grathwell,
William Jeffries, Wojciech Wnętrzak, Xavier Shay, Yoshihiro Ashida, Yuji
Nakayama, Zshawn Syed, chrisarcand, liam-m, mrageh, sleepingkingstudios, yui-knk</li>
</ul>
<h3 id="rspec-core">rspec-core:</h3>
<ul>
<li><strong>Total Commits</strong>: 194</li>
<li><strong>Merged pull requests</strong>: 66</li>
<li><strong>18 contributors</strong>: Alexander Skiba, Alireza Bashiri, Benjamin Quorning,
Bradley Schaefer, Jon Moss, Jon Rowe, Matt Jones, Michele Piccirillo, Myron
Marston, Patrik Wenger, Perry Smith, Sam Phippen, Simon Coffey, Thomas Hart II,
Travis Grathwell, Yuji Nakayama, mrageh, yui-knk</li>
</ul>
<h3 id="rspec-expectations">rspec-expectations:</h3>
<ul>
<li><strong>Total Commits</strong>: 83</li>
<li><strong>Merged pull requests</strong>: 25</li>
<li><strong>14 contributors</strong>: Alex Altair, Ben Saunders, Benjamin Quorning, Bradley
Schaefer, James Coleman, Jon Rowe, Myron Marston, Rob Smith, Sam Phippen,
William Jeffries, Yuji Nakayama, Zshawn Syed, chrisarcand, sleepingkingstudios</li>
</ul>
<h3 id="rspec-mocks">rspec-mocks:</h3>
<ul>
<li><strong>Total Commits</strong>: 82</li>
<li><strong>Merged pull requests</strong>: 28</li>
<li><strong>17 contributors</strong>: Andrew Kozin (aka nepalez), Benjamin Quorning, Bradley
Schaefer, Bruno Bonamin, David Rodríguez, Isaac Betesh, Joe Rafaniello, Jon
Rowe, Kilian Cirera Sant, Marc Ignacio, Martin Emde, Myron Marston, Patrik
Wenger, Ryan Beckman, Sam Phippen, Tobias Bühlmann, Yuji Nakayama</li>
</ul>
<h3 id="rspec-rails">rspec-rails:</h3>
<ul>
<li><strong>Total Commits</strong>: 185</li>
<li><strong>Merged pull requests</strong>: 47</li>
<li><strong>31 contributors</strong>: Ahmed AbouElhamayed, Al Snow, Andrew White, Anton Rieder,
Benjamin Quorning, Bradley Schaefer, DarthSim, David Rodríguez, Diogo Benicá,
Eliot Sykes, Fernando Seror, Gautam Sawhney, John Schroeder, Jon Rowe, Jun
Aruga, Koen Punt, Liss McCabe, Miklos Fazekas, Myron Marston, Peter Swan, Prem
Sichanugrist, Rob, Ryan Clark, Sam Phippen, Scott Bronson, Sergey Pchelintsev,
Timo Schilling, Wojciech Wnętrzak, Xavier Shay, Yoshihiro Ashida, Yuji Nakayama</li>
</ul>
<h3 id="rspec-support">rspec-support:</h3>
<ul>
<li><strong>Total Commits</strong>: 81</li>
<li><strong>Merged pull requests</strong>: 26</li>
<li><strong>8 contributors</strong>: Aaron Stone, Bradley Schaefer, Jon Rowe, Myron Marston,
Sam Phippen, Yuji Nakayama, liam-m, sleepingkingstudios</li>
</ul>
<h2 id="docs">Docs</h2>
<h3 id="api-docs">API Docs</h3>
<ul>
<li><a href="/documentation/3.5/rspec-core/">rspec-core</a></li>
<li><a href="/documentation/3.5/rspec-expectations/">rspec-expectations</a></li>
<li><a href="/documentation/3.5/rspec-mocks/">rspec-mocks</a></li>
<li><a href="/documentation/3.5/rspec-rails/">rspec-rails</a></li>
</ul>
<h3 id="cucumber-features">Cucumber Features</h3>
<ul>
<li><a href="http://relishapp.com/rspec/rspec-core">rspec-core</a></li>
<li><a href="http://relishapp.com/rspec/rspec-expectations">rspec-expectations</a></li>
<li><a href="http://relishapp.com/rspec/rspec-mocks">rspec-mocks</a></li>
<li><a href="http://relishapp.com/rspec/rspec-rails">rspec-rails</a></li>
</ul>
<h2 id="release-notes">Release Notes</h2>
<h3 id="rspec-core-combining-all-betas-of-rspec-350">RSpec Core (combining all betas of RSpec 3.5.0)</h3>
<h4 id="section-1">3.5.0 / 2016-07-01</h4>
<p><a href="http://github.com/rspec/rspec-core/compare/v3.5.0.beta4...v3.5.0">Full Changelog</a></p>
<p>Enhancements:</p>
<ul>
<li>Include any <code>SPEC_OPTS</code> in reproduction command printed at the end of
a bisect run. (Simon Coffey, #2274)</li>
</ul>
<p>Bug Fixes:</p>
<ul>
<li>Handle <code>--bisect</code> in <code>SPEC_OPTS</code> environment variable correctly so as
to avoid infinite recursion. (Simon Coffey, #2271)</li>
</ul>
<h4 id="beta4--2016-06-05">3.5.0.beta4 / 2016-06-05</h4>
<p><a href="http://github.com/rspec/rspec-core/compare/v3.5.0.beta3...v3.5.0.beta4">Full Changelog</a></p>
<p>Enhancements:</p>
<ul>
<li>Filter out bundler stackframes from backtraces by default, since
Bundler 1.12 now includes its own frames in stack traces produced
by using <code>bundle exec</code>. (Myron Marston, #2240)</li>
<li>HTML Formatter uses exception presenter to get failure message
for consistency with other formatters. (@mrageh, #2222)</li>
<li>Load spec files in the order of the directories or files passed
at the command line, making it easy to make some specs run before
others in a one-off manner. For example, <code>rspec spec/unit
spec/acceptance --order defined</code> will run unit specs before acceptance
specs. (Myron Marston, #2253)</li>
<li>Add new <code>config.include_context</code> API for configuring global or
filtered inclusion of shared contexts in example groups.
(Myron Marston, #2256)</li>
<li>Add new <code>config.shared_context_metadata_behavior = :apply_to_host_groups</code>
option, which causes shared context metadata to be inherited by the
metadata hash of all host groups and examples instead of configuring
implicit auto-inclusion based on the passed metadata. (Myron Marston, #2256)</li>
</ul>
<p>Bug Fixes:</p>
<ul>
<li>Fix <code>--bisect</code> so it works on large spec suites that were previously triggering
"Argument list too long errors" due to all the spec locations being passed as
CLI args. (Matt Jones, #2223).</li>
<li>Fix deprecated <code>:example_group</code>-based filtering so that it properly
applies to matching example groups. (Myron Marston, #2234)</li>
<li>Fix <code>NoMethodError</code> caused by Java backtraces on JRuby. (Michele Piccirillo, #2244)</li>
</ul>
<h4 id="beta3--2016-04-02">3.5.0.beta3 / 2016-04-02</h4>
<p><a href="http://github.com/rspec/rspec-core/compare/v3.5.0.beta2...v3.5.0.beta3">Full Changelog</a></p>
<p>Enhancements:</p>
<ul>
<li>Add new <code>config.filter_run_when_matching</code> API, intended to replace
the combination of <code>config.filter_run</code> and
<code>config.run_all_when_everything_filtered</code> (Myron Marston, #2206)</li>
</ul>
<p>Bug Fixes:</p>
<ul>
<li>Use the encoded string logic for source extraction. (Jon Rowe, #2183)</li>
<li>Fix rounding issue in duration formatting helper. (Fabersky, Jon Rowe, #2208)</li>
<li>Fix failure snippet extraction so that <code>def-end</code> snippets
ending with <code>end</code>-only line can be extracted properly.
(Yuji Nakayama, #2215)</li>
</ul>
<h4 id="beta2--2016-03-10">3.5.0.beta2 / 2016-03-10</h4>
<p><a href="http://github.com/rspec/rspec-core/compare/v3.5.0.beta1...v3.5.0.beta2">Full Changelog</a></p>
<p>Enhancements:</p>
<ul>
<li>Remove unneeded <code>:execution_result</code> example group metadata, saving a
bit of memory. (Myron Marston, #2172)</li>
<li>Apply hooks registered with <code>config</code> to previously defined groups.
(Myron Marston, #2189)</li>
<li><code>RSpec::Core::Configuration#reporter</code> is now public API under SemVer.
(Jon Rowe, #2193)</li>
<li>Add new <code>config.when_first_matching_example_defined</code> hook. (Myron
Marston, #2175)</li>
</ul>
<h4 id="beta1--2016-02-06">3.5.0.beta1 / 2016-02-06</h4>
<p><a href="http://github.com/rspec/rspec-core/compare/v3.4.4...v3.5.0.beta1">Full Changelog</a></p>
<p>Enhancements:</p>
<ul>
<li>Add <code>RSpec::Core::ExampleGroup.currently_executing_a_context_hook?</code>,
primarily for use by rspec-rails. (Sam Phippen, #2131)</li>
</ul>
<p>Bug Fixes:</p>
<ul>
<li>Ensure <code>MultipleExceptionError</code> does not contain a recursive reference
to itself. (Sam Phippen, #2133)</li>
</ul>
<h3 id="rspec-expectations-including-all-betas-of-rspec-350">RSpec Expectations (including all betas of RSpec 3.5.0)</h3>
<h4 id="section-2">3.5.0 / 2016-07-01</h4>
<p><a href="http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta4...v3.5.0">Full Changelog</a></p>
<p><strong>No user facing changes since beta4</strong></p>
<h4 id="beta4--2016-06-05-1">3.5.0.beta4 / 2016-06-05</h4>
<p><a href="http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta3...v3.5.0.beta4">Full Changelog</a></p>
<p>Bug Fixes:</p>
<ul>
<li>Fix <code>include</code> matcher so that it provides a valid diff for hashes. (Yuji Nakayama, #916)</li>
</ul>
<h4 id="beta3--2016-04-02-1">3.5.0.beta3 / 2016-04-02</h4>
<p><a href="http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta2...v3.5.0.beta3">Full Changelog</a></p>
<p>Enhancements:</p>
<ul>
<li>Make <code>rspec/expectations/minitest_integration</code> work on Minitest::Spec
5.6+. (Myron Marston, #904)</li>
<li>Add an alias <code>having_attributes</code> for <code>have_attributes</code> matcher.
(Yuji Nakayama, #905)</li>
<li>Improve <code>change</code> matcher error message when block is mis-used.
(Alex Altair, #908)</li>
</ul>
<h4 id="beta2--2016-03-10-1">3.5.0.beta2 / 2016-03-10</h4>
<p><a href="http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta1...v3.5.0.beta2">Full Changelog</a></p>
<p>Enhancements:</p>
<ul>
<li>Add the ability to raise an error on encountering false positives via
<code>RSpec::Configuration#on_potential_false_positives = :raise</code>. (Jon Rowe, #900)</li>
<li>When using the custom matcher DSL, support new
<code>notify_expectation_failures: true</code> option for the <code>match</code> method to
allow expectation failures to be raised as normal instead of being
converted into a <code>false</code> return value for <code>matches?</code>. (Jon Rowe, #892)</li>
</ul>
<p>Bug Fixes:</p>
<ul>
<li>Allow <code>should</code> deprecation check to work on <code>BasicObject</code>s. (James Coleman, #898)</li>
</ul>
<h4 id="beta1--2016-02-06-1">3.5.0.beta1 / 2016-02-06</h4>
<p><a href="http://github.com/rspec/rspec-expectations/compare/v3.4.0...v3.5.0.beta1">Full Changelog</a></p>
<p>Enhancements:</p>
<ul>
<li>Make <code>match_when_negated</code> in custom matcher DSL support use of
expectations within the match logic. (Chris Arcand, #789)</li>
</ul>
<p>Bug Fixes:</p>
<ul>
<li>Return <code>true</code> as expected from passing negated expectations
(such as <code>expect("foo").not_to eq "bar"</code>), so they work
properly when used within a <code>match</code> or <code>match_when_negated</code>
block. (Chris Arcand, #789)</li>
</ul>
<h3 id="rspec-mocks-including-all-betas-of-rspec-350">RSpec Mocks (including all betas of RSpec 3.5.0)</h3>
<h4 id="section-3">3.5.0 / 2016-07-01</h4>
<p><a href="http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta4...v3.5.0">Full Changelog</a></p>
<p>Enhancements:</p>
<ul>
<li>Provides a nice string representation of
<code>RSpec::Mocks::MessageExpectation</code> (Myron Marston, #1095)</li>
</ul>
<h4 id="beta4--2016-06-05-2">3.5.0.beta4 / 2016-06-05</h4>
<p><a href="http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta3...v3.5.0.beta4">Full Changelog</a></p>
<p>Enhancements:</p>
<ul>
<li>Add <code>and_throw</code> to any instance handling. (Tobias Bühlmann, #1068)</li>
</ul>
<h4 id="beta3--2016-04-02-2">3.5.0.beta3 / 2016-04-02</h4>
<p><a href="http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta2...v3.5.0.beta3">Full Changelog</a></p>
<p>Enhancements:</p>
<ul>
<li>Issue warning when attempting to use unsupported
<code>allow(...).to receive(...).ordered</code>. (Jon Rowe, #1000)</li>
<li>Add <code>rspec/mocks/minitest_integration</code>, to properly integrate rspec-mocks
with minitest. (Myron Marston, #1065)</li>
</ul>
<h4 id="beta2--2016-03-10-2">3.5.0.beta2 / 2016-03-10</h4>
<p><a href="http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta1...v3.5.0.beta2">Full Changelog</a></p>
<p>Enhancements:</p>
<ul>
<li>Improve error message displayed when using <code>and_wrap_original</code> on pure test
doubles. (betesh, #1063)</li>
</ul>
<p>Bug Fixes:</p>
<ul>
<li>Fix issue that prevented <code>receive_message_chain(...).with(...)</code> working
correctly on "any instance" mocks. (Jon Rowe, #1061)</li>
</ul>
<h4 id="beta1--2016-02-06-2">3.5.0.beta1 / 2016-02-06</h4>
<p><a href="http://github.com/rspec/rspec-mocks/compare/v3.4.1...v3.5.0.beta1">Full Changelog</a></p>
<p>Bug Fixes:</p>
<ul>
<li>Allow <code>any_instance_of(...).to receive(...)</code> to use <code>and_yield</code> multiple
times. (Kilian Cirera Sant, #1054)</li>
<li>Allow matchers which inherit from <code>rspec-mocks</code> matchers to be used for
<code>allow</code>. (Andrew Kozin, #1056)</li>
<li>Prevent stubbing <code>respond_to?</code> on partial doubles from causing infinite
recursion. (Jon Rowe, #1013)</li>
<li>Prevent aliased methods from disapearing after being mocked with
<code>any_instance</code> (regression from #1043). (Joe Rafaniello, #1060)</li>
</ul>
<h3 id="rspec-support-including-all-betas-of-rspec-350">RSpec Support (including all betas of RSpec 3.5.0)</h3>
<h4 id="section-4">3.5.0 / 2016-07-01</h4>
<p><a href="http://github.com/rspec/rspec-support/compare/v3.5.0.beta4...v3.5.0">Full Changelog</a></p>
<p><strong>No user facing changes since beat4</strong></p>
<h4 id="beta4--2016-06-05-3">3.5.0.beta4 / 2016-06-05</h4>
<p><a href="http://github.com/rspec/rspec-support/compare/v3.5.0.beta3...v3.5.0.beta4">Full Changelog</a></p>
<p>Enhancements:
* Improve <code>MethodSignature</code> to better support keyword arguments. (#250, Rob Smith).</p>
<h4 id="beta3--2016-04-02-3">3.5.0.beta3 / 2016-04-02</h4>
<p><a href="http://github.com/rspec/rspec-support/compare/v3.5.0.beta2...v3.5.0.beta3">Full Changelog</a></p>
<p>Bug Fixes:</p>
<ul>
<li>Fix <code>EncodedString</code> to properly handle the behavior of <code>String#split</code>
on JRuby when the string contains invalid bytes. (Jon Rowe, #268)</li>
<li>Fix <code>ObjectFormatter</code> so that formatting objects that don't respond to
<code>#inspect</code> (such as <code>BasicObject</code>) does not cause <code>NoMethodError</code>.
(Yuji Nakayama, #269)</li>
<li>Fix <code>ObjectFormatter</code> so that formatting recursive array or hash does not
cause <code>SystemStackError</code>. (Yuji Nakayama, #270, #272)</li>
</ul>
<h4 id="beta2--2016-03-10-3">3.5.0.beta2 / 2016-03-10</h4>
<p><a href="http://github.com/rspec/rspec-support/compare/v3.5.0.beta1...v3.5.0.beta2">Full Changelog</a></p>
<p>No user-facing changes.</p>
<h4 id="beta1--2016-02-06-3">3.5.0.beta1 / 2016-02-06</h4>
<p><a href="http://github.com/rspec/rspec-support/compare/v3.4.1...v3.5.0.beta1">Full Changelog</a></p>
<h2 id="footnotes">Footnotes</h2>
<div class="footnotes">
<ol>
<li id="fn:foot_1">
<p>See also Eileen's <a href="https://www.youtube.com/watch?v=oT74HLvDo_A">talk about request spec performance</a> <a href="#fnref:foot_1" class="reversefootnote">↩</a></p>
</li>
</ol>
</div>
<div id="disqus_thread"></div>
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
var disqus_shortname = 'rspec';
var disqus_identifier = '/ja/blog/2016/07/rspec-3-5-has-been-released/';
var disqus_title = 'RSpec 3.5 がリリースされました!';
var disqus_url = 'http://rspec.info/ja/blog/2016/07/rspec-3-5-has-been-released/';
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
</article></section><footer><div>Created with the assistance of Ninefold<img alt="Brutus" src="/images/brutus-half.png" /></div><br /><a href="https://dnsimple.link/resolving-rspec" target="_blank">Resolving with<br /><img alt="DNSimple" style="width:100px;" src="https://cdn.dnsimple.com/assets/resolving-with-us/logo-dark.png" /></a></footer><script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-59095215-1', 'auto');
ga('send', 'pageview');
</script>
<script>
var SeedAndDewConfig = {};
(function() {
SeedAndDewConfig['adClass'] = "snd-ad";
/* * * DON'T EDIT BELOW THIS LINE * * */
SeedAndDewConfig['projectId'] = 'ef35b4ec-231e-4950-bd93-4c06fe3b2543';
SeedAndDewConfig['loadStartTime'] = performance.now();
SeedAndDewConfig['apiVersion'] = '2018-05-28'
SeedAndDewConfig['sessionId'] = Math.random().toString(36).substring(2, 15);
var snd = document.createElement('script');
snd.type = 'text/javascript';
snd.async = true;
snd.src = 'https://www.seedanddew.com/static/embed.min.js';
(document.getElementsByTagName('head')[0] ||
document.getElementsByTagName('body')[0]).appendChild(snd);
})();
</script>
</body><script src="/javascripts/asciinema-player.js"></script></html>