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 を利用します。
設定
$ 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 に関する参考文献です