Как передать значения коллекции флажков в спецификации контроллера с помощью rspec и rails 3 - PullRequest
0 голосов
/ 06 мая 2011

с рельсами 3 и rspec. У меня есть форма в виде, как это ..

<%= form_for current_account, { :url => admins_account_path(current_account), :method => 'put' } do %>
  <div class="action">
    <%= submit_tag "Save" %>
  </div>
  <table>
    <tbody>

      <% @accountships.each do |accountship| %>
        <tr>
          <td><%= check_box_tag "accountship_ids[]", accountship.id, accountship.admin? %></td>
          <td><%= accountship.user.name %>
        </tr>
      <% end %>

    </tbody>
  </table>
<% end %>

А в контроллере я обрабатываю PUT этим методом в account # update_admin. Это все работает, как ожидалось.

@account.assign_administrators params[:accountship_ids]

Мой вопрос заключается в том, как мне построить параметры в rspec для проверки этого действия контроллера. То, что я пробовал до сих пор, не работает. Вот моя последняя попытка, которая не работает.

before(:each) do
  # code that generates the ids, I know this is working from other tests ..
  .
  .
  .
  @attr = {
    :accountship_ids => [
      @admin_accountship.id,
      @not_admin_accountship.id,
      @signed_in_user_accountship.id
    ]
  }
end

it "should assign admin to users in the list" do

  # what should I be passing in as @attr?
  put :update_admins, :id => @account, :accountship_ids => @attr  

  Accountship.find(@admin_accountship.id).admin.should be_true
  Accountship.find(@owner_accountship.id).admin.should be_true
  Accountship.find(@not_admin_accountship.id).admin.should_not be_true
end

Все тесты, которые я смог написать, для которых требуются значения из коллекции флажков формы, не выполняются, и очевидно, что атрибут what_accountship.admin не обновляется, когда тест rspec публикует данные.

Заранее спасибо!

EDIT

Я наткнулся на решение. Массив не должен был быть заключен в хеш, а значения в литерале массива необходимо сначала преобразовать в строки, как показано ниже.

 @attr = [
   @admin_accountship.id.to_s,
   @not_admin_accountship.id.to_s,
   @signed_in_user_accountship.id.to_s
 ]

Кто-нибудь понимает, почему они должны быть строками, когда другие мои тесты могут принять полноценный объект (строки не требуются)?

Кроме того, что мне теперь делать с моим вопросом, когда я знаю ответ?

1 Ответ

0 голосов
/ 06 мая 2011

Похоже, что вы присваиваете хэш params переменной экземпляра, а затем создаете новый хеш с первым хешем в качестве значения и пропускаете весь беспорядок в операторе put, когда все, что вам нужно сделать, это передать оригинальные параметры. Или другими словами:

put :update_admins, :id => @account.id, @attr

EDIT

Извините, долгий день. Параметры должны входить в один хеш после действия, поэтому:

put :update_admins, {:id=>@account.id}.merge(@attr)

РЕДАКТИРОВАТЬ 2

Синтаксис хэша будет работать, если вы передадите строки в массиве:

@attr = {
  :accountship_ids => [
    @admin_accountship.id.to_s,
    @not_admin_accountship.id.to_s,
    @signed_in_user_accountship.id.to_s
  ]
}

Если вы хотите решить вопрос своим собственным ответом, я думаю, вы можете просто создать ответ и затем принять его.

...