3

twitter bootstrap gemを使用して、インデックスページにcreated_at列を表示するビューを生成しています。足場とともに生成されるrspecテストは、stub_modelを使用してインデックスビューをテストします。nilのcreated_at列のため、これらのテストは失敗します。

steb_modelがダミーIDとして生成するのと同じように、created_at列をTime.nowとして設定することもできます。それはconfigを介して行うことができます。または、スタブを作成するたびに指定する必要がありますか。

4

2 に答える 2

6

ソースコードから判断すると、これはデフォルトでは不可能のようです。これにより、いくつかのオプションが残ります。

1.created_atモデルスタブを作成するたびに値を指定します。

m = stub_model(MyModel, :created_at => Time.now)

2.created_atスタブの初期化後に属性を設定する独自のヘルパーメソッドを作成します。

module Helpers
  def stub_model_with_timestamp(model_class, stubs={})
    stub_model(model_class, { :created_at => Time.now }.merge(stubs))
  end
end

次に、モジュールをに含めるだけspec_helper.rbで、すべての仕様で使用できるようになります。

RSpec.configure do |config|
  include Helpers
  ...
end

3.本当にそのまま使用したい場合stub_methodは、モジュールを再度開いて元のメソッドのエイリアスを作成することで、rspec-railsにモンキーパッチを適用して希望どおりに機能させることができます。

module RSpec::Rails::Mocks
  def stub_model_with_timestamp(model_class, stubs={})
    stub_model_without_timestamp(model_class, { :created_at => Time.now }.merge(stubs))
  end

  alias_method_chain :stub_model, :timestamp
end 

これをファイルに入れるspec/support/と自動的に読み込まれるため、モデルをスタブすると自動的にcreated_atタイムスタンプが設定されます。

最後に、これは他の人も使いたいと思うかもしれない便利な機能だと思うので、実際にrspec-railsにプルリクエストを作成して、デフォルト設定を構成オプションとして追加することを検討してください。(もしそうなら、完全を期すために、おそらく同様に設定したいと思うでしょうupdated_at。)

お役に立てば幸いです。

于 2012-11-27T13:54:55.833 に答える
2

spec_helper.rbに以下を追加しました。

module RSpec::Rails::Mocks
  def stub_model_with_timestamp(*args)
    stub_model_without_timestamp(*args).tap{|o| o.created_at ||= Time.now }
  end

  alias_method_chain :stub_model, :timestamp
end

もう1つのソリューションは、スタブ呼び出しに追加のパラメーターを追加するため、「* args、:created_at=>Time.now」で問題が発生しました。

于 2012-12-07T22:18:50.177 に答える