空気ねこにもおおよそ分かるにんげんは牛ではないことを RSpec で証明してみた
ネットミームをコードで表現してみるかもしれないシリーズ。
まあ、にんげん(Human
)と牛(Cow
)の抽象クラス Animal
を定義する:
# lib/animal.rb class Animal end
中身は何も無いけど、そのうち実装されるっしょ。ヘーキヘーキ。
ここら辺で Animal
クラス必要ないなって思ったけど、まあいいか。
ああ、次は牛とにんげんだ…。
# lib/cow.rb require_relative 'animal' class Cow < Animal end
次はにんげん。
# lib/human.rb require_relative 'animal' class Human < Animal end
何も中身ないけど、ヘーキヘーキ。
ということで、スペックファイルを書いてみよう。
describe Human do it 'にんげんは牛ではない' do # TODO: ここでにんげんは牛ではないことをしょーめーする end end
ここで describe
のブロックの中で Human
は described_class
って書けるらしい。
さて、にんげんは牛ではないことを調べるにはどうすればいいだろう?
とぼけるのも疲れてきたので、長年温めてきた常識を働かせてみると、明らかに Human
と Cow
は別のものだ。
つまり:
if Human != Cow then puts 'にんげんは牛じゃないよ!' else puts 'ふえぇぇ………、にんげんは牛だったようです………' end
ってやって、「にんげんは牛じゃないよ!」って表示されればいいわけだ。そうだよね?
こーいうのを RSpec でかっこよく書きたい。
RSpec ではテストする主体?を except()
に渡す。それで、 .to
ってやって……
同じかどうか調べるには equal()
に調べたい値を渡す。
except( described_class ).to equal( Cow )
いいぞ!
described_class
の替わりに Human
って書いても良い。
except( Human ).to equal( Cow )
いいね!
でもちょっと待って。
こうすると、Human
と Cow
は同じかどうか調べることになってしまう!
どうしよう?!
.to
の替わりに .to_not
を使うことで、式の否定版にすることができる。
じゃあ、こんな感じかな?
except( described_class ).to_not equal( Cow )
うまくいった!
it
の中に移してみよう:
describe Human do it 'にんげんは牛ではない' do except( described_class ).to_not equal( Cow ) end end
おしまい。
完成したのが こっちにあるので、てきとーに答え合わせしてみてね。