はじめてのRSpec - まずテスト書いてからコード書くシンプルなチュートリアル

  • 230
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

87802.png

Rubyをあまりさわったことない初心者向けの内容です。

細かいところは置いておいて、とりあえずRSpecでテスト書く→コード実装のような、超シンプルなチュートリアルをまとめてみました。

下準備

install

$ gem install rspec

rspec -- init

$ rspec --init
  create   spec/spec_helper.rb
  create   .rspec

シンプルなチュートリアル

以下の差分はこちら: https://github.com/luckypool/testing-with-rspec

(1) テスト対象を決める

  • 今回は /lib/dog.rb とかを想定する
  • まだコードは書かなくてOK
    • どんなclassかは決めておく。

(2) テストファイルをつくる

  • こんな感じ spec/lib/dog_spec.rb
    • <name_of_spec>_spec.rb というように _spec.rb というsuffixつける

(3) 最初のテストコード

spec/lib/dog_spec.rb
require "spec_helper"

describe "Dog" do
  it "is named 'Pochi'"
end
  • name が 'Pochi' であるインスタンスが生成されると期待を込めて。
  • 実行結果は・・・
$ rspec spec/lib/dog_spec.rb
*

Pending:
  Dog is named 'Pochi'
    # Not yet implemented
    # ./spec/lib/dog_spec.rb:4

Finished in 0.00025 seconds
1 example, 0 failures, 1 pending
  • 未実装でペンディングされてるよ!って結果になりました。

(4)対象モジュールを読み込んだ上でペンディングする

lib/dog.rb
class Dog

end
  • まだ空っぽです
spec/lib/dog_spec.rb
require "spec_helper"
require "dog"

describe Dog do
  it "is named 'Pochi'"
end
  • 実際にモジュールを読み込んでみます。
  • 実行結果は・・・
$ rspec spec/lib/dog_spec.rb
*

Pending:
  Dog is named 'Pochi'
    # Not yet implemented
    # ./spec/lib/dog_spec.rb:5

Finished in 0.00035 seconds
1 example, 0 failures, 1 pending
  • まだペンディング中!

(5)期待通りに落ちるテストを書く

spec/lib/dog_spec.rb
require "spec_helper"
require "dog"

describe Dog do
  it "is named 'Pochi'" do
    dog = Dog.new
    expect(dog.name).to eq 'Pochi'
  end
end
  • 英語っぽくテストがかけますね!
    • 追記。上記の例では expect を使っていますが、コメントで頂いたような書き方もできます!
    • 参考に追記したエントリや、まわりのRubyistに学んでシャレオツなコードを書きたいですね :)
  • 実行結果は・・・
$ rspec spec/lib/dog_spec.rb
F

Failures:

  1) Dog is named 'Pochi'
     Failure/Error: expect(dog.name).to eq 'Pochi'
     NoMethodError:
       undefined method `name' for #<Dog:0x007fea60987400>
     # ./spec/lib/dog_spec.rb:7:in `block (2 levels) in <top (required)>'

Finished in 0.00031 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/lib/dog_spec.rb:5 # Dog is name 'Pochi'
  • ちゃんと落ちました。

(6)テストが通るように実装する

lib/dog.rb
class Dog
  attr_accessor :name

  def initialize(name="Pochi")
    @name = name
  end
end
  • 実行結果はもちろん・・
$ rspec spec/lib/dog_spec.rb
.

Finished in 0.00122 seconds
1 example, 0 failures
  • パスしましたね! :)

(7)テスト追加して実装を繰り返す

spec/lib/dog_spec.rb
require "spec_helper"
require "dog"

describe Dog do
  it "is named 'Pochi'" do
    dog = Dog.new
    expect(dog.name).to eq 'Pochi'
  end

  it "has fangs" do
    dog = Dog.new
    expect(dog.fangs).to eq 2
  end

  it "is alived" do
    dog = Dog.new
    expect(dog).to be_alived
  end
end
lib/dog.rb
class Dog
  attr_accessor :name, :fangs

  def initialize(name="Pochi")
    @name = name
    @fangs = 2
  end

  def alived?
    true
  end
end
  • グリーン!!
$ spec spec/lib/dog_spec.rb
...

Finished in 0.00249 seconds
3 examples, 0 failures

参考

Expectations

テストコードは expect(hogehoge).to be_true なんて風に書けます。
他にも色々と表現できるのですが、詳しくは下記のREADMEに載っています。

あと、should という expectation もありますが、expectの方が新しいものだそうです。


以上!