RSpec やテストを苦手とする人はかなり多いだろうと思う。
実装は瞬殺だったのに、RSpec の書き方に悩んでしまって何日もプルリクエストを出せていない。
不運にもそんな状況に陥ってしまった人に贈る。
私は理論的な背景を研究したわけでもないので、実務家としてこうだろうと理解したことをアウトプットする。
spec は仕様という意味
wikipedia のスペックの説明を見て欲しい。
スペックとは、英語で spec (specification の省略形。読みは「スペシフィケーション」)は、いわゆる仕様書のことであるが、和製英語の範疇では一般に工業製品に期待される性能のことである。俗に「カタログスペック」や「基本スペック」、「諸元」などのように表現される。自動車のカタログなどでよくみられる。
なかでも、
いわゆる仕様書のことであるが、和製英語の範疇では一般に工業製品に期待される性能のことである。
という部分。
この和製英語の範疇で理解していた人も多いのではないだろうか。
是非とも「仕様」という意味で頭の中の定義を上書きしておいて欲しい。
仕様という言葉の意味は広くて曖昧だが、それでも我々は平気で「仕様」と口にする。そのときに想起するような意味だと思えば良い。
## 構造: 主語・主題と述語と条件節 (describe, it, context)
it ってなんだろう
ネストの一番深くには、 it
や、その別名とされる example
, specify
がいる。これらに渡すブロックの中で実際の期待を書くのだ。
it '文字列を返す' do
expect(some_object.some_method(arg)).to be_a String
end
# 別の書き方
example 'それが文字列を返す' do
expect(some_object.some_method(arg)).to be_a String
end
specify 'それが文字列を返すこと' do
expect(some_object.some_method(arg)).to be_a String
end
それぞれ響き方が違う。自然な響き方をする書き方が違う。
it は代名詞で、主語の位置にいる
辞書を引くまでもないだろう。
振る舞いにフォーカスする
英語話者にとって、 it
による例は次のように響いているはずだ。
それは '文字列を返す' do
expect(some_object.some_method(arg)).to be_a String
end
「それ」が主語であり「文字列を返す」は「それ」の振る舞いである。
主語を自由に選べないという制約によって、「文字列を返す」という振る舞いの記述に焦点が当たる。
英語話者はこういう感覚でプログラミングしているのだ。
describe: つまり「それ」ってなんなんだ
it
が代名詞であるというのなら、その代名詞が何を指示しているのかを特定しなければならない。
それはネストのより浅いところで宣言されているはずだ。
describe 'SomeClass' do
describe '#some_method' do
it '文字列を返す' do
expect(some_object.some_method(arg)).to be_a String
end
end
end
describe は説明する・描写する・記述するという意味だが、説明する対象を目的語にとる。
「describe an apple (あるリンゴを説明する)」とあれば、
あるリンゴがどのような形で、どのような色味を帯びているかを説明するのだろう。
「そのリンゴは赤い」「そのリンゴはゴツゴツしている」
つまり、
「それは赤い」「それはゴツゴツしている」
何か繋がった感じがしないだろうか。
まとめて読んでみよう。
あるリンゴを説明する。
それは赤い。
それはごつごつしている。
describe は主題を特定する
describe は記述対象を目的語に取る。
rubyとしての語順は壊れてしまうけど、例を次のように訳してみよう。
'とあるクラス' を説明する do
'とあるインスタンスメソッド(#some_method)' を説明する do
それは '文字列を返す' do
expect(some_object.some_method(arg)).to be_a String
end
end
end
「それ」が何を示しているのか、一目瞭然ではないだろうか。
「とあるクラスのとあるインスタンスメソッドは文字列を返す」
describe の度に主題の範囲が狭まっていくのがわかるだろう。
繰り返すけれど、英語話者はこんな感覚でプログラミングしてるはずだ。
context には主題でもなく振る舞いでもないものを
主題でも振る舞いでもないものって何があるだろう。
オブジェクトの状態、メソッドがとる引数、その他依存先。
そういうものを context に書くのが良いのではないかと思う。
context は文脈や前後関係と訳せる。
前提、背景、状況。
「〇〇のとき」「〇〇であるならば」
振る舞い方がそういった外部の状況に依存しているのであれば、それはコンテクストだ。
## まとめ
- it に主語を固定すれば振る舞いに焦点が当たる
- describe は主題を特定し、主語を明確にする
- context は依存関係
私はそんなことを意識して書いてる。もちろんいつでも適用できるわけではないけれど。
ちなみになるべく「こと」は書かない主義。