空気ねこにもおおよそ分かるにんげんは牛ではないことを 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 のブロックの中で Humandescribed_class って書けるらしい。
さて、にんげんは牛ではないことを調べるにはどうすればいいだろう?
とぼけるのも疲れてきたので、長年温めてきた常識を働かせてみると、明らかに HumanCow は別のものだ。

つまり:

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 )

いいね!
でもちょっと待って。
こうすると、HumanCow は同じかどうか調べることになってしまう!
どうしよう?!

.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

おしまい。

完成したのが こっちにあるので、てきとーに答え合わせしてみてね。