Rspec-заглушка поиска находит перечисляемый вместо одного объекта - PullRequest
0 голосов
/ 02 января 2011

Я только начинаю работать с rspec 2 и думаю, что возникла проблема где-то в одной из моих заглушек. Я пытаюсь проверить действие 'show' из моего client_controller.rb, но оно не удается, возвращая Enumerable :: Enumerator вместо объекта. Действие 'index' работает отлично. Моя цель - убедиться, что вошедший в систему пользователь может просматривать своих клиентов, но не других клиентов пользователя.

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

Я не уверен, что я ошибаюсь в издевательствах, самих тестах или где-то еще.

1 Ответ

0 голосов
/ 20 апреля 2011

Причина, по которой он возвращает перечислимое, состоит в том, что Rails 3 не загружает все записи, когда вы вызываете ассоциацию клиентов, вместо этого он возвращает перечислимое, поэтому он может быть более эффективным с памятью. По сути, у вас есть поддельные курсоры базы данных. Я не уверен, как бы вы решили это, но это должно по крайней мере ответить на ваш вопрос о том, что идет не так.

Вы можете попробовать это, хотя:

get :index
assigns(:clients).to_a.should eq([@my_client])
...