4

これらのテストは、乱数が 20 未満の場合にのみパスするという問題があります。テストでこれをどのように説明すればよいですか?

私のテスト:

it 'a plane cannot take off when there is a storm brewing' do
    airport = Airport.new [plane]
    expect(lambda { airport.plane_take_off(plane) }).to raise_error(RuntimeError) 
end

it 'a plane cannot land in the middle of a storm' do
    airport = Airport.new []
    expect(lambda { airport.plane_land(plane) }).to raise_error(RuntimeError) 
end

私のコードの抜粋:

def weather_rand
  rand(100)
end

def plane_land plane
  raise "Too Stormy!" if weather_ran <= 20
  permission_to_land plane
end

def permission_to_land plane
  raise "Airport is full" if full?
  @planes << plane
  plane.land!
end

def plane_take_off plane
  raise "Too Stormy!" if weather_ran <= 20
  permission_to_take_off plane
end

def permission_to_take_off plane
  plane_taking_off = @planes.delete_if {|taking_off| taking_off == plane }
  plane.take_off!
end
4

3 に答える 3

5

weather_randテストしようとしているものと一致する既知の値を返すには、メソッドをスタブする必要があります。

https://www.relishapp.com/rspec/rspec-mocks/v/2-14/docs/method-stubs

例えば:

it 'a plane cannot take off when there is a storm brewing' do
    airport = Airport.new [plane]
    airport.stub(:weather_rand).and_return(5)
    expect(lambda { airport.plane_take_off(plane) }).to raise_error(RuntimeError) 
end
于 2013-10-18T13:58:17.080 に答える
3

rand特定のケースをカバーする数値の範囲を生成するために使用して、コーナー ケースをカバーします。私はlet次のような天候範囲の遅延インスタンス化を行うために使用します:

let(:weather_above_20) { rand(20..100) }
let(:weather_below_20) { rand(0..20) }

次に、テストでweather_above_20and変数を使用します。weather_below_20テスト条件を分離することが常に最善です。

遅延インスタンス化についてもう少し: https://www.relishapp.com/rspec/rspec-core/docs/helper-methods/let-and-let

于 2013-10-19T02:59:14.503 に答える