1

Michael Hartl の Rails チュートリアルに従いながら、テスト セクションでいくつかのカスタム関数を試していたところ、驚くべき制限に遭遇しました。基本的に、グローバル パス変数 (例: "root_path") は、RSpec テストの "describe" ブロック内の "it" セクションの "do...end" ブロック内でのみ機能します。

次の詳細は、「it」ブロックの外側では機能せずに「root_path」がそこで機能することを可能にした「it」ブロックの何が特別なのかという質問に要約されると思います。

(回避策を決定しましたが、この動作についてしっかりした説明があるかどうか知りたいです。)

ファイル: spec/requests/static_pages_spec.rb

これは失敗します:

require 'spec_helper'

def check_stable(path)
  it "should be stable" do
    get path
    response.status.should be(200)
  end
end

describe "StaticPages" do
  describe "Home => GET" do
    check_stable(root_path)
  end
end

これは成功します:

require 'spec_helper'

describe "StaticPages" do
  describe "Home => GET" do
    it "should be stable" do
      get root_path
      response.status.should be(200)
    end
  end
end

失敗は基本的に次のとおりです。

$ bundle exec rspec spec/requests/static_pages_spec.rb
Exception encountered: #<NameError: undefined local variable or method `root_path' for #<Class:0x00000004cecd78>>

...理由はわかりますか?

これらの2つのスレッドですべての提案を試しました:

Hartl のチュートリアル セクション 5.3.2: Rails Routes

Rspec と名前付きルート

上記の問題を解決するまで、何も機能しませんでした。

4

2 に答える 2

2

はい、名前付きルートはitまたはspecifyブロック内でのみ機能します。しかし、コードを変更するのは簡単です:

def should_be_stable(path)
  get path
  response.status.should be(200)
end

describe "StaticPages" do
  describe "Home => GET" do
    it { should_be_stable(root_path) }
  end
end

url_helpers を含める必要があります

于 2013-02-16T07:22:40.827 に答える
1

itブロック (またはspecifyブロック) は、実際のテストを表すものです。テスト内では、Rails および Rspec ヘルパーの完全な補完にアクセスできます。テストの外では、それほど多くはありません(あなたが解決したように)。

于 2013-02-16T07:25:04.367 に答える