0

rspec 2 を使い始めたばかりで、メソッド スタブのどこかに問題があると思います。client_controller.rb から 'show' アクションをテストしようとしていますが、失敗し、オブジェクトではなく Enumerable::Enumerator が返されます。「インデックス」アクションは正常に機能します。私の目標は、現在ログインしているユーザーが自分のクライアントを表示できるようにすることですが、他のユーザーのクライアントは表示できないようにすることです。

before_filter :require_user

def index
  @clients = current_user.clients
end
def show
  @client = current_user.clients.find(params[:id])
end

と:

before :each do
  stub_current_user
  @my_client = mock_model(Client, :user_id => @current_user.id)
  @not_my_client = mock_model(Client, :user_id => @current_user.id + 1)
  @current_user.stub!(:clients) { @clients = [@my_client] }
  @clients.stub!(:find){ @my_client }
end

describe "GET index" do
  it "assigns the current user's clients as @clients" do
    get :index
    assigns(:clients).should eq([@my_client])
  end
end

describe "GET show" do
  it "assigns the requested client as @client if @client is the current user's client" do
    get :show, :id => @my_client.id
    assigns(:client).should eq(@my_client)
  end

  it "does not assign the requested client if @client is not the current user's client" do
    get :show, :id => @not_my_client.id
    assigns(:client).should == nil
  end
end

stub_current_user は spec_helpers.rb にあります:

def stub_current_user
  @current_user = mock_model(User, :name => 'Bob Johnson', :email => 'bob@johnson.com', 
                                   :role => "account_holder", :incomplete_subscription? => false, 
                                   :plan => mock_model(Plan, :client_limit => 5),
                                   :monthly_rate => 100)
  if defined?(controller) # for controller specs
    controller.stub!(:current_user).and_return(@current_user)
  elsif defined?(template) # for view specs
    template.stub!(:current_user).and_return(@current_user)
  else
    'wat'
  end
end

「index」アクションのテストはパスしますが、「show」アクションの両方のテストは次のエラーで失敗します。

1) ClientsController GET show assigns the requested client as @client if @client is the current user's client
 Failure/Error: assigns(:client).should eq(@my_client)

 expected #<Client:0x81b67840 @name="Client_1007">
      got #<Enumerable::Enumerator:0x1036471d0>

 (compared using ==)

 Diff:
 @@ -1,2 +1,2 @@
 -#<Client:0x81b67840 @name="Client_1007">
 +#<Enumerable::Enumerator:0x1036471d0>
 # ./spec/controllers/clients_controller_spec.rb:31

2) ClientsController GET show does not assigns the requested client if @client is not the current user's client
 Failure/Error: assigns(:client).should == nil
 expected: nil,
      got: #<Enumerable::Enumerator:0x1035336b8> (using ==)
 # ./spec/controllers/clients_controller_spec.rb:39

モック、テスト自体、または他の場所で間違っているかどうかはわかりません。

4

1 に答える 1

0

列挙可能を返す理由は、Rails 3がクライアントアソシエーションを呼び出すときにすべてのレコードをロードするのではなく、列挙可能を返すため、メモリを使用してより効率的になる可能性があるためです。基本的に、偽のデータベースカーソルがあります。これをどのように解決するかはわかりませんが、少なくとも何が問題になっているのかについての質問に答える必要があります。

あなたはこれを試すかもしれません:

get :index
assigns(:clients).to_a.should eq([@my_client])
于 2011-04-19T23:09:03.993 に答える