LoginSignup
2
2

More than 5 years have passed since last update.

rspecを導入してみた

Posted at

テストしてますか!?

僕は非常にテストが苦手です。
なんでだろうと思い起こすと、自分の性格が関係しているのだと思います。
動くところをすぐに見たくて、早く動かしてみたくなってしまうんです。
テストを書いておくと動作確認が早くできます。
使い捨てプロトタイプでもない限り、テストは必要です。
という事で、テストを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)

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2