Как вы настраиваете аргументы, которые передаются в 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