LoginSignup
17
11

More than 5 years have passed since last update.

rspec-givenを利用したGiven/When/Thenスタイルのテスト

Posted at

Given/When/Then とは?

Given/When/Then は BDDのテストを書く際に利用される記法です。
基本的な考え方として、テストを3つのセクションに分割して記載します。
これにより各ブロックごとの役割がひと目で分かり、可読性が高まることがメリットと考えられます。
(このスタイルが読みやすいと思わない人にはメリットになりませんね)

1. Given

Given では振る舞いを実行する前の状態を記述します

2. When

When では振る舞いを記述します

3. Then

Then では振る舞いの結果を記述します

サンプル

RSpecで Given/When/Then スタイルのサンプルを書いてみます。
rspec はデフォルトでは Given/When/Then スタイルをサポートしていないので、
rspec-given gem を利用します。

設定

rspec-given - GitHub

$ gem install rspec-given

コード

  • プロダクトコード
require "sample/version"
require "sample"

class Person
  attr_reader :name, :age

  def initialize(name, age)
    @name = name
    @age = age
  end

  def next
    @age = age.next
  end
end
  • テストコード
require "spec_helper"
require "sample"
require "rspec-given"

describe Person do
  context "#fullname" do
    Given(:person) { ::Person.new("tanaka", 32) }
    When { person.next }
    Then { person.age == 33 }
    And { person.name == "tanaka" }
  end
end
  • 実行(成功)
$ rspec
.

Finished in 0.0012 seconds (files took 0.1706 seconds to load)
1 example, 0 failures
  • 実行(失敗)

失敗するようにわざとテストを変更してみます

$ rspec
F

Failures:

  1) Person#fullname     Then { person.age == 34 }

     Failure/Error: Then { person.age == 34 }

       Then expression failed at /path/to/project/spec/sample_spec.rb:9
       expected: 33
       to equal: 34
         false   <- person.age == 34
         33      <- person.age
         #<Person:0x007f985410a2e0 @name="tanaka", @age=33>
                 <- person
     # ./vendor/ruby/2.3.0/gems/given_core-3.8.0/lib/given/rspec/framework.rb:24:in `fail_with'
     # ./vendor/ruby/2.3.0/gems/given_core-3.8.0/lib/given/module_methods.rb:42:in `fail_with'
     # ./vendor/ruby/2.3.0/gems/given_core-3.8.0/lib/given/extensions.rb:127:in `_gvn_naturally_assert'
     # ./vendor/ruby/2.3.0/gems/given_core-3.8.0/lib/given/extensions.rb:118:in `_gvn_evaluate'
     # ./vendor/ruby/2.3.0/gems/given_core-3.8.0/lib/given/extensions.rb:102:in `_gvn_then'
     # ./spec/sample_spec.rb:9:in `block in Then'

Finished in 0.01827 seconds (files took 0.14176 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/sample_spec.rb:9 # Person#fullname     Then { person.age == 34 }

文献

Given When Then に関する参考文献です

17
11
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
17
11