为什么控制器规格失败?

时间:2015-04-28 20:37:32

标签: ruby-on-rails rspec

我为控制器操作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

1 个答案:

答案 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 %>

这样模板就会显示错误