読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

同じexampleを複数のテストで共有する

RSpec documentationの「Shared Example Groups」に説明がありますが、「shared_examples_for」を使用して同じexampleを複数のテストで共有することが可能です。

  • 「shared_examples_for <共有exampleグループ名>」で共有するexampleのグループ(「Shared Example Groups」と呼ばれるらしい。)を作成し、
  • 共有したいテスト内で「it_should_behave_like <共有exampleグループ名>」としてexampleを取り込めばOK
    • モジュールをincludeする感じですな。
  • exampleだけでなく、beforeやafterも共有できます。
# shared_examples_for で 共通のexampleを定義。
shared_examples_for "shared" do
  # 複数のテストで共有するexample
  it "shared ex1" do
    puts "    shared ex1"
  end
  # beforeやafterも定義できる。
  before { puts "    shared before" }
  after   { puts "    shared after" }
end

describe "foo" do
  # it_should_behave_likeで共有するexampleを取り込む
  it_should_behave_like "shared"
  it "foo ex1" do
    puts "    foo ex1"
  end
  before { puts "    foo before" }
  after   { puts "    foo after" }
end

describe "var" do
   it_should_behave_like "shared"   
end

実行結果です。foo,varで共有exampleとして定義したex1が実行されています。

$ spec -fs shared_example_groups.spec 

foo
    shared before
    foo before
    shared ex1
    foo after
    shared after
- shared ex1
    shared before
    foo before
    foo ex1
    foo after
    shared after
- foo ex1

var
    shared before
    shared ex1
    shared after
- shared ex1

Finished in 0.024 seconds

3 examples, 0 failures

複数のbeforeがある場合の呼びだし順

テスト内に複数のbeforeがある場合、定義された順に実行されるようです。

shared_examples_for "shared1" do
  before { puts "    shared1 before" }
  after   { puts "    shared1 after" }
end
shared_examples_for "shared2" do
  before { puts "    shared2 before" }
  after   { puts "    shared2 after" }
end

# 複数のbeforeがある場合、呼び出し順は定義されている順になる模様
# 以下の場合、
#   shared2のbefore, shared1のbefore, fooのbefore
# の順で呼ばれる。(afterはその逆)
describe "foo" do
  it_should_behave_like "shared2"
  it_should_behave_like "shared1"
  it "foo ex1" do
    puts "    foo ex1"
  end
  before { puts "    foo before" }
  after   { puts "    foo after" }
end

# 以下の場合、
#   fooのbefore, shared1のbefore, shared2のbefore, 
# の順で呼ばれる。
describe "var" do
  it "var ex1" do
    puts "    var ex1"
  end
  before { puts "    var before" }
  after   { puts "    var after" }
  it_should_behave_like "shared1"
  it_should_behave_like "shared2"
end

実行結果です。

$ spec -fs shared_example_groups2.spec 

foo
    shared2 before
    shared1 before
    foo before
    foo ex1
    foo after
    shared1 after
    shared2 after
- foo ex1

var
    var before
    shared1 before
    shared2 before
    var ex1
    shared2 after
    shared1 after
    var after
- var ex1

Finished in 0.023 seconds

2 examples, 0 failures