4

Rails 3.2の使用サブディレクトリにコントローラーがあります(例:/controllers/data_feeds/acme_feed_controller.rb)

このコントローラーには、以下のような定数があります

class DataFeeds::AcmeFeedController < ApplicationController

  MY_CONSTANT = "hi

  def do_something do
    ...
  end

end

私のrspecコントローラー仕様(/spec/controllers/data_feeds/acme_feed_controller_spec.rbにあります)では、その定数にアクセスしたいと思います。以下は、私が試した2つの方法です(両方とも以下のコードでコメントアウトされています)

describe AcmeFeedController do
  if "tests something" do
    #c = AcmeFeedController.MY_CONSTANT
    #c = DataFeeds::AcmeFeedController.MY_CONSTANT
  end
end

スペックテストが実行される範囲について、私は明らかに何かを理解していません。何をする必要があり、その理由も同様に重要です(つまり、スコープで何が起こっているのか)。

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

4

2 に答える 2

14

定数はドット構文で参照できないためDataFeeds::AcmeFeedController.MY_CONSTANT、どのコンテキストでも機能しません。::定数を参照するには、を使用する必要がありますDataFeeds::AcmeFeedController::MY_CONSTANT

これはルビーの問題であり、RSpecとは何の関係もないことに注意してください。このような問題に直面した場合は、RSpecでどのように機能するかを心配する前に、プレーンルビー(IRBなど)でそれを行う方法を理解することをお勧めします(とにかく、通常は同じです)。

ルビーで定数がどのように機能するかを知りたい場合は、それらを詳細に説明するこのトークをご覧になることをお勧めします。

于 2012-08-10T19:20:10.077 に答える
2

また、コントローラークラスの名前空間を繰り返さずにこれを行うことができます。

describe AcmeFeedController do
  if "tests something" do
    c = controller.class.const_get('MY_CONSTANT')
  end
end

この種のトリックは、アプリケーションコードでは承認されない場合がありますが、テストでは承認される場合があります。

于 2017-07-13T03:25:57.980 に答える