Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

はじめに

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の方が新しいものだそうです。


以上!

luckypool
へっぽこえんじーにゃ
https://github.com/luckypool
mixi
全ての人に心地よいつながりを
http://mixi.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした