6

にアクセスするヘルパーがありrequest.fullpathます。分離されたヘルパー テスト内でrequestは使用できません。私は何をすべきか?どういうわけかそれを嘲笑することはできますか?

Rails と RSpec の最新バージョンを使用しています。私のヘルパーは次のようになります。

def item(*args, &block)
  # some code

  if request.fullpath == 'some-path'
    # do some stuff
  end
end

したがって、問題のあるコード行は #4 で、requestヘルパー仕様では使用できないオブジェクトにヘルパーがアクセスする必要があります。

助けてくれてどうもありがとう。

4

2 に答える 2

5

はい、リクエストをモックできます。私はここでそれを行う方法を説明する長い答えを持っていましたが、実際にはそれは必ずしもあなたが望むものではありません.

例のヘルパー オブジェクトでヘルパー メソッドを呼び出すだけです。そのようです:

describe "#item" do
  it "does whatever" do
    helper.item.should ...
  end
end

これにより、テスト リクエスト オブジェクトにアクセスできるようになります。リクエスト パスに特定の値を指定する必要がある場合は、次のように指定できます。

before :each do
  helper.request.path = 'some-path'
end

実際、完全を期すために、元の回答を含めておきましょう。あなたがやろうとしていることによっては、まだ役立つかもしれないからです。

リクエストをモックする方法は次のとおりです。

request = mock('request')
controller.stub(:request).and_return request

同様に、返されたリクエストにスタブ メソッドを追加できます。

request.stub(:method).and_return return_value

そして、モックとスタブをすべて 1 行で行う代替構文:

request = mock('request', :method => return_value)

スタブしていないメッセージをモックが受け取った場合、Rspec は文句を言います。ヘルパーオブジェクトでリクエストヘルパーメソッドを呼び出すだけで、テストで気にしないことが他にある場合は、モックを「nullオブジェクト」にすることでrspecをシャットダウンできます。のように

 request = mock('request').as_null_object

特定のテストに合格するために必要なのは、おそらくこれだけのようです。

describe "#item" do
  let(:request){ mock('request', :fullpath => 'some-path') }

  before :each do
    controller.stub(:request).and_return request
  end

  it "does whatever"
end
于 2012-09-21T13:25:06.600 に答える
0

ヘルパー スペックでは、次を使用してリクエストにアクセスできますcontroller.request(動作するcontroller.request.stub(:fullpath) { "whatever" }はずです) 。

于 2012-09-21T10:14:54.423 に答える