2

こんばんは、

クラスメソッド「is_male_alive?」を呼び出す「Simulation」クラスでかなり長いメソッドをテストしようとしています。と「is_female_alive?」私の「年齢」クラスで数百回。これらのクラスメソッドの戻り値は統計に基づいており、テストが毎回同じように実行されるように、特定の値を返すようにそれらをスタブ化したいと思います。

Age.rb:

...

def is_male_alive?(age)
  return false if age > 119
  if (age < 0 || age == nil || age == "")
    return false
  end    
  death_prob = grab_probability_male(age)
  rand_value = rand
  rand_value > death_prob
end

...

(女性バージョンは基本的に同じですが、いくつかの異なる定数があります)

私の「シミュレーション」クラスでは、次のことを行います。

def single_simulation_run

  ...
  male_alive = Age.is_male_alive?(male_age_array[0])
  female_alive = Age.is_female_alive?(female_age_array[0])
  ...
end

シミュレーションの各反復で-基本的には、年齢を過ぎて(たとえば、is_male_alive?(56))、trueまたはfalseを返します。

これらの2つの方法をスタブ化して、次のようにします。

  1. is_male_alive?75未満の引数の場合はtrueを返し、それ以外の場合はfalseを返します。
  2. is_female_alive?80未満の引数の場合はtrueを返し、それ以外の場合はfalseを返します。

私はそれをスタブする能力があるかどうかを確認するために以下を試しました(simulation_spec.rb):

Age.should_receive(:is_male_alive?).exactly(89).times
results = @sim.send("generate_asset_performance")

しかし、次のエラーが発生します。

 Failure/Error: Age.should_receive(:is_male_alive?).exactly(89).times
   (<Age(id: integer, age: integer, male_prob: decimal, female_prob: decimal) (class)>).is_male_alive?(any args)
       expected: 89 times
       received: 0 times

また、スタブされた戻り値が引数に基づいて動的に生成されるように設定する方法もわかりません。procでこれを行う方法はありますか?

Ageクラス全体をモックする方法はありますか(Ageクラスの単一のインスタンスをモックするだけではありませんか?)

ご協力いただきありがとうございます!!

更新1

このメソッドの呼び出しに問題があるようです...これは本当に混乱します。それが呼び出されているかどうかを実際に確認するために、メソッドに「raiseArgumentError」をスローしました。

開発環境(コンソール):

1.9.3p125 :003 > sim = Simulation.last
1.9.3p125 :004 > sim.generate_results
  --->  ArgumentError: ArgumentError

したがって、argumenterrorをスローしたため、開発環境でこのメソッドを明確に呼び出しています。

私のテストでこれをもう一度実行しましたが、それでもメソッドが呼び出されていないと言っています...以下のコードを使用しています:

Age.should_receive(:is_male_alive?).with(an_instance_of(Fixnum)).at_least(:once) { |age| age < 75 }

私もこれを試しました

Age.should_receive(:is_male_alive?).with(an_instance_of(Fixnum)).at_least(:once) { raise ArgumentError }

何かご意見は?

4

1 に答える 1

7

ブロックを使用できます。rspec のメッセージ期待値ドキュメントの任意の処理を参照してください: http://rubydoc.info/gems/rspec-mocks/frames

Age.should_receive(:is_male_alive?).with(an_instance_of(Fixnum)).at_least(:once) { |age| age < 75 }
Age.should_receive(:is_female_alive?).with(an_instance_of(Fixnum)).at_least(:once) { |age| age < 80 }
于 2012-05-10T04:09:02.710 に答える