3

特定のメソッドをスタブ化する必要がある多くのビュー仕様があります。これが私がうまくいくと思ったものです(spec_helper.rb内):

Spec::Runner.configure do |config|
  config.before(:each, :type => :views) do
      template.stub!(:request_forgery_protection_token)
      template.stub!(:form_authenticity_token)
  end
end

しかし、ビュースペックを実行すると失敗します

You have a nil object when you didn't expect it! The error occurred while evaluating nil.template

各例の before(:each) ブロックでまったく同じことを行うとうまくいきます。

4

1 に答える 1

3

私はあなたの例を試してみましたが、「config.before」ブロックでは、ビュー仕様ファイルの「前」ブロックと比較して、RSpec ビュー例オブジェクトがまだ完全に初期化されていないことがわかりました。したがって、「config.before」ブロックでは、テンプレートがまだ初期化されていないため、「template」メソッドは nil を返します。たとえば、これらの両方のブロックに「puts self.inspect」を含めることで確認できます。

あなたの場合、DRYer仕様を達成するための1つの回避策は、spec_helper.rbで定義することです

Rスペック2

module StubForgeryProtection
  def stub_forgery_protection
    view.stub(:request_forgery_protection_token)
    view.stub(:form_authenticity_token)
  end
end

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

Rスペック1

module StubForgeryProtection
  def stub_forgery_protection
    template.stub!(:request_forgery_protection_token)
    template.stub!(:form_authenticity_token)
  end
end

Spec::Runner.configure do |config|
  config.before(:each, :type => :views) do
    extend StubForgeryProtection
  end
end

そして、このスタブを使用する各 before(:each) ブロックにインクルードします

before(:each) do
  # ...
  stub_forgery_protection
  # ...
end
于 2008-12-22T22:23:04.883 に答える