RSpec

rspecを導入してみた

More than 5 years have passed since last update.


テストしてますか!?

僕は非常にテストが苦手です。

なんでだろうと思い起こすと、自分の性格が関係しているのだと思います。

動くところをすぐに見たくて、早く動かしてみたくなってしまうんです。

テストを書いておくと動作確認が早くできます。

使い捨てプロトタイプでもない限り、テストは必要です。

という事で、テストをrspecで書いてみようと思います。


minitestを使ってみる

標準でインストールされているminitestを使ってみてからrspecと比較してみましょう。

Memeクラスにi_can_has_cheezburger?のメソッドを作成します。

なれるまでは大変なのですが、テストから書いてみましょう。


OSX 10.9 ruby 2.0.0-p353で操作確認しています。



test_meme.rb

require_relative 'meme'

require 'minitest/autorun'

class TestMeme < MiniTest::Unit::TestCase
def setup
@meme = Meme.new
end

def test_that_kitty_can_eat
assert_equal "OHAI!", @meme.i_can_has_cheezburger?
end
end


i_can_has_cheezburger?のメソッドを定義しましょう。

戻り値はnilでいいです。


meme.rb

class Meme

def i_can_has_cheezburger?
nil
end
end

さて、実行してみます。

$ ruby test_meme.rb

MiniTest::Unit::TestCase is now Minitest::Test. From test_meme.rb:4:in `<main>'
Run options: --seed 60940

# Running:

F

Finished in 0.024583s, 40.6785 runs/s, 40.6785 assertions/s.

1) Failure:
TestMeme#test_that_kitty_can_eat [test_meme.rb:10]:
Expected: "OHAI!"
Actual: nil

1 runs, 1 assertions, 1 failures, 0 errors, 0 skips

OHAI!という文字列が返ってくることを期待しているが、実際はnilが返っているのでテストは失敗しているという結果です。

i_can_has_cheezburger?メソッドにOHAI!を返すようにしてテストを実行してみます。


memo.rb

class Meme

def i_can_has_cheezburger?
"OHAI!"
end
end

さて、実行してみます。

$ ruby test_meme.rb

Run options: --seed 60679

# Running tests:

.

Finished tests in 0.000784s, 1275.5102 tests/s, 1275.5102 assertions/s.

1 tests, 1 assertions, 0 failures, 0 errors, 0 skips

今度は成功しました。

他のテストの書き方もあるようなので紹介します。


meme_spec.rb

require_relative 'meme'

require 'minitest/autorun'

describe Meme do
before do
@meme = Meme.new
end

describe "when asked about cheeseburgers" do
it "must respond positively" do
@meme.i_can_has_cheezburger?.must_equal "OHAI!"
end
end
end


テストが失敗したときにwhen asked about cheesebergersと表示されるので、ここにどんなテストかを書いておけば、debugには役に立ちそうです。


RSpecを使ってみる

さて、そろそろRSpecを使ってみましょう。まずは、インストールからですね。


Gemfile

source "https://rubygems.org"

gem "rspec", "~> 2.14.1"


$ bundle install --path=vendor/bundle

Fetching gem metadata from https://rubygems.org/.........
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies...
Installing diff-lcs (1.2.5)
Installing rspec-core (2.14.7)
Installing rspec-expectations (2.14.4)
Installing rspec-mocks (2.14.4)
Installing rspec (2.14.1)
Using bundler (1.3.5)
Your bundle is complete!
It was installed into ./vendor/bundle

さーてインストールできたぞ。


meme_rspec.rb

require_relative 'meme'

describe Meme do
before do
@meme = Meme.new
end

describe "when asked about cheeseburgers" do
it "must respond positively" do
@meme.i_can_has_cheezburger?.should eq("OHAI!")
end
end
end


そして、早速実行。

$ bundle exec rspec meme_rspec.rb

.

Finished in 0.00108 seconds
1 example, 0 failures


最後に

minitestRSpecを使ってみました。

今回のケースだけでいうとどちらも同じような書き方ができることが分かりました。

次回は、もう少し深くRSpecを使ってみようと思います。

テストが好きになってきました。(言い聞かせているwww)