我为控制器操作create
编写了一个规范,当我运行测试时,shell显示错误
expected #count to have changed by 1, but was changed by 0
有规格
let(:valid_attributes) { FactoryGirl.attributes_for(:company) }
describe 'with valid params' do
it 'creates a new company' do
expect { post :create, company: valid_attributes }.to change(Company, :count).by(1)
并且有工厂
FactoryGirl.define do
factory :company do
title Faker::Company.name
url Faker::Internet.domain_word
image File.open(File.join(Rails.root, '/spec/fixtures/POEox311zoM.jpg'))
end
end
怎么修复?我不知道我做错了什么
UPD
def create
@company = Company.new(company_params)
if @company.save
redirect_to root_path
else
redirect_to root_path
end
end
答案 0 :(得分:0)
@object.save
和@object.save!
之间的区别在于第一个会因为返回false而轻微失败,这就是我们if @object.save
的原因,因为如果保存并返回true
否则false
。第二个(爆炸!
方法)抛出一个错误,这对于你没有检查返回值或者是一个rake任务的情况更为可靠。
同样对于您的控制器,您应该处理失败的保存而不仅仅是重定向,例如:
def create
@company = Company.new(company_params)
if @company.save
redirect_to root_path
else
render :new
end
end
这样,失败的对象被带到:new
模板,然后你可以处理这些错误,就像这样
<% if @company.errors %>
<% @company.errors.full_messages.each do |message| %>
<div class='error'><%= message %></div>
<% end %>
<% end %>
这样模板就会显示错误