LoginSignup
3
5

More than 5 years have passed since last update.

RSpec

Last updated at Posted at 2017-11-04

具体的な実装の記載はこちら

rspec

  • 公式サイト https://relishapp.com/rspec TDD(test-driven development)手法を取り入れたテストフレームワークです。

TDD(テスト駆動開発)とはなにか

wikipediaより

プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き(これをテストファーストと言う)、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。

ざっくりと、、手順

  1. ある機能の振る舞いを洗い出し、そ
  2. 失敗するテストを書く(テストから書いているため失敗するのは当たり前。)
  3. 成功するテストを書く(仮実装をして、テスト側に問題があるのを防ぐ。それから明らかな実装を行う)
    1. リファクタリング(コードの重複をまとめたり、実装を本格化する)

この流れをグルグル回す

  • 仮実装 => 絶対に成功するコードをかく
  • 明らかな実装 => 実際の実装コード
  • 同じ対象に対して違う角度からテストする(三角測量)
  • railsでのrspecの実行の仕方 bundle exec rspec rspecファイルのpathを指定
  • optionで-fbをつけると見やすくなる(cfo-a)

出力結果の見方(-fbオプションを加えた場合)

  • describeまたはcontextの説明がインテンドでわかりやすく表示されている
  • 緑が成功
  • 赤が失敗
  • Failures: 以降に具体的な間違いを指摘してくれる
  • expected 期待した値
  • got 実際の値 => 一致しないのでテスト失敗している

書き方

describe

  • テスト対象のグループ分け
  • 入れ子できる 
  • グループの分け方がものだった場合こっち 
  • トップレベルのdedcribeはよくクラス名を書くことが多い
    describe "クラスのテスト" do
    end
    describe クラス名 do
    end

context

  • テスト対象のグループ分け
  • describeと同じ 
  • グループの分け方が状況だった場合こっち
expect "when method exists" do
end
  • 説明文はrspec実行する時に-fdをつけたときに表示されるので、わかりやすいように名前をつけとくのがミソ

it

  • テスト対象に対して、期待する振る舞いを記載
  • 説明文は省略できる
    • 例 calcオブジェクトのaddメソッドに引数2,3を渡した時の返り値が5になる
   it "given 2 and 3, returns 5" do
      calc = Calc.new
      expect(calc.add(2, 3)).to eq(5)
    end
#省略形
   it {
    calc = Calc.new
    expect(calc.add(2, 3)).to eq(5)
   }
  • 省略するとrspecが自動で説明文描いてくれる
should eq 5
  • 仕様の振る舞いだけ書いておきたい場合。
it "振る舞い" 
  • 黄色で表示
  • itで期待する振る舞いを書く時に使う記号 -> macharという

expect(calc).to respond_to(:add)

# integer? empty?
 expect(calc.add(2, 3).integer?).to be true
 expect(calc.add(2, 3)).to be_integer

before

  • exampleの共通化処理をブロックにまとめる
# インスタンス化処理を共通化
before(:option) do 
    @calc = Calc.new
  end

  • オプション
    • 省略したらexampleがデフォルトで入る
    • example それぞれのexampleで実行したい
    • context 最初の一回目のexampleだけ実行
    • exampleをまたがって変数を使用する場合は@を前につける

subject

  • 主対象の操作を管理できる
  • describeにクラス名を指定した場合、subjectでインスタンス化できる。
 # desribeにCalcクラスを指定した場合、Calcオブジェクトになる
expect(subject.add(2,3)).to eq(5)
  • subjectをそのまま使うと何を表しているのかわからなくなるので
subject(:hoge){ Hoge.new }
  • こう宣言しとけばhogeを各ブロックで使える
  • beforeと同じだが、exampleで使う時は@要らない。シンボルで管理できる。

let

  • ほぼsubjectと同じ役割
  • 主対象以外の変数などの操作を管理する
let(:tax){ 0.08 }
it{expect(seminar.price(100,tax)).to eq(108)}
  • 遅延評価される
  • 遅延評価ではなく、example毎で必ず実行したい場合はlet!をつかう
  • exsample毎にキャッシュされる

test doubl

  • 実装はまだだけどテストはしたい場合に使用
  • method stub => 実装していないけれどテストに使えるメソッドを作る。または、テストする必要のない処理などの返り値を指定する

    
    
    • allowでseminarというオブジェクトを選択し、receiveでそのオブジェクトのexist?メソッドを選択、その返り値をand_reternで指定している
    • receive_message_chainでメソッドチェーンで複数していできる。
    • withで引数を渡す
    
    
    • 引数を持たないメソッドにはno_argsをしていてあげる
  • message expectation

  • 呼ばれなかったらfalseでテストは失敗する

3
5
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
3
5