Изменение хэша, который передается при создании POST rspec - PullRequest
2 голосов
/ 26 февраля 2012

Как вы настраиваете аргументы, которые передаются в rspec's (v 2.6.1) post :create? Указывать мне на rspec документацию, которая объясняет эту команду и как ее использовать, было бы хорошо для меня. Я пошел искать, но не могу найти ничего, что отвечает на мой вопрос.

Мне трудно написать rspec для правильного поведения для моего Клиента: создать действие, которое получает параметры как для Клиента, так и для другого объекта User. Точнее, я не могу получить значения в хэше, которые я передаю в посте rspec: создать, чтобы вести себя как входные данные из моей формы.

Обратите внимание, что мои объекты Customer и User являются отдельными ActiveRecords, и каждый Customer: принадлежит_ пользователю.

Вот мой RSpec, который не делает то, что я хочу:

describe CustomersController do

  render_views

  describe "for signed-in admins" do

    before(:each) do
      @customer_attr = Factory.attributes_for(:customer)
      @admin = Factory(:admin)
      test_sign_in(@admin.user)
    end

    describe "POST 'create'" do

      describe "success" do

        it "should create a customer" do
          lambda do
            post :create, :customer => @customer_attr # The problem is here
          end.should change(Customer, :count).by(1)
        end
      end
    end
  end
end

Вот ошибка:

1) CustomersController for signed-in admins POST 'create' success should create a customer
  Failure/Error: lambda do
    count should have been changed by 1, but was changed by 0
  # ./spec/controllers/customers_controller_spec.rb:323:in `block (5 levels) in <top (required)>'

Проблема (как вы увидите ниже), очевидно, заключается в том, что post :create, :customer => @customer_attr не содержит аргумента, который заканчивается в params[:user][:email], поэтому @ user.save терпит неудачу, поскольку params [: user] пуст , но я пробовал все виды способов перекомпоновки хэша и передачи его в той строке, но не могу заставить его работать.

Вот соответствующий код контроллера:

def create
  @user = User.new(params[:user])
  @user.user_type = 'customer'

  @customer = Customer.new(params[:customer])

  if @user.save
    @user.customer = @customer
    if @customer.save
      # create stuff
      redirect_to customer_path, :flash => { :success => "Customer created." }
    else
      # failure stuff
    end
  else
    # more failure stuff
  end
end

Вот соответствующий код формы (который ведет себя так, как я хочу):

<%= form_for(@customer) do |f| %>

  <%= fields_for :user do |user_form| %>
    <%= user_form.label :email %>
    <%= user_form.text_field :email %>
  <% end %>

  <%= f.label :first_name %>
  <%= f.text_field :first_name %>
  <%= f.label :last_name %>
  <%= f.text_field :last_name %>

  <%= f.submit "Create Customer Account" %>
<% end %>

Наконец, вот мой код фабрики:

factory :user do |f|
  f.sequence :email do |n|
    "person#{n}@example.com"
  end
  f.password                "thepassword"
  f.password_confirmation   "thepassword"
end

factory :customer do |f|
  f.first_name  "First"
  f.last_name   "Last"
  f.user
  after_build { |customer| customer.user.user_type = 'customer' }
end

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Решение, которое я нашел, состояло в том, чтобы составить мой хеш, чтобы он выглядел именно так, как я хотел, а затем передать его напрямую, без :customer => перед ним.Доступ к элементам, например, params[:customer][:first_name] или params[:user][:email]

И rspec выглядит следующим образом:

post :create, @customer_and_user_attr
0 голосов
/ 27 февраля 2012

Так что, если я правильно понимаю ваш вопрос, вам просто нужно передать другой ключ к post, а именно :user => @admin.user.Я тебя неправильно понял?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...