Rspec構文を学習するだけで、このコードが機能することに気付きました。
context "given a bad list of players" do
let(:bad_players) { {} }
it "fails to create given a bad player list" do
expect{ Team.new("Random", bad_players) }.to raise_error
end
end
しかし、このコードはそうではありません:
context "given a bad list of players" do
let(:bad_players) { {} }
it "fails to create given a bad player list" do
expect( Team.new("Random", bad_players) ).to raise_error
end
end
それは私にこのエラーを与えます:
Team given a bad list of players fails to create given a bad player list
Failure/Error: expect( Team.new("Random", bad_players) ).to raise_error
Exception:
Exception
# ./lib/team.rb:6:in `initialize'
# ./spec/team_spec.rb:23:in `new'
# ./spec/team_spec.rb:23:in `block (3 levels) in <top (required)>'
私の質問は:
また、rulesを使用するタイミングを探しています
このコードが機能する同じ、しかし逆の結果のもう1つの例:
it "has a list of players" do
expect(Team.new("Random").players).to be_kind_of Array
end
しかし、このコードは失敗します
it "has a list of players" do
expect{ Team.new("Random").players }.to be_kind_of Array
end
この場合のエラーは次のとおりです。
Failure/Error: expect{ Team.new("Random").players }.to be_kind_of Array
expected #<Proc:0x007fbbbab29580@/Users/amiterandole/Documents/current/Ruby_sandbox/tdd-Ruby/spec/team_spec.rb:9> to be a kind of Array
# ./spec/team_spec.rb:9:in `block (2 levels) in <top (required)>'
私がテストしているクラスは次のようになります。
class Team
attr_reader :name, :players
def initialize(name, players = [])
raise Exception unless players.is_a? Array
@name = name
@players = players
end
end
言及されているように:
expect(4).to eq(4)
これは、メソッドへのパラメーターとして送信した値を具体的にテストしています。同じことをするときに発生したエラーをテストしようとしているとき:
expect(raise "fail!").to raise_error
あなたの引数は評価されます即時そしてその例外が投げられ、あなたのテストはすぐに爆発します。
ただし、ブロックを使用する場合(これは基本的なRubyです)、ブロックの内容はすぐには実行されません-実行は呼び出しているメソッドによって決定されます(この場合、expect
メソッドはブロックを実行します):
expect{raise "fail!"}.to raise_error
この動作を処理する可能性のあるメソッドの例を見ることができます。
def expect(val=nil)
if block_given?
begin
yield
rescue
puts "Your block raised an error!"
end
else
puts "The value under test is #{val}"
end
end
エラーが発生するかどうかをテストできるように、手動でエラーを救出しているのはexpect
メソッドであることがわかります。yield
はRubyメソッドの方法ですメソッドに渡されたブロックを実行します。
最初の場合、ブロックをexpect
に渡すと、ブロックの実行は結果を評価する時まで発生しません。その時点で、RSpecコードは発生したエラーをキャッチしてチェックできます期待に反して。
2番目のケースでは、expect
への引数が評価されるときにエラーが発生するため、expect
コードには関与する機会がありません。
ルールに関しては、ブロックを渡すか、テストする場合はProc
を渡しますbehavior(たとえば、エラーの発生、値の変更)。それ以外の場合は、「従来の」引数を渡します。この場合、その引数の値がテストされます。