8

我重构了我OrgController的使用respond_with,现在控制器规范脚手架失败并显示此消息:

1) OrgsController POST create with invalid params re-renders the 'new' template
   Failure/Error: response.should render_template("new")
     expecting <"new"> but rendering with <"">

规范如下所示:

it "re-renders the 'new' template" do
 Org.any_instance.stub(:save).and_return(false)
 post :create, {:org => {}}, valid_session
 response.should render_template("new")
end

我读过我应该对:errors哈希进行存根以使其看起来有错误。最好的方法是什么?

4

4 回答 4

14

使用在 v3 中引入的 RSpec 的新语法,存根看起来像

allow_any_instance_of(Org).to receive(:save).and_return(false)
allow_any_instance_of(Org).to receive_message_chain(:errors, :full_messages)
  .and_return(["Error 1", "Error 2"])

相关的控制器代码看起来像

if org.save
  head :ok
else
  render json: {
    message: "Validation failed",
    errors: org.errors.full_messages
  }, status: :unprocessable_entity # 422
end
于 2014-12-02T10:42:16.877 回答
4

消息:

expecting <"new"> but rendering with <"">

表明它是重定向而不是渲染。要么你的存根不成功,要么你的控制器在控制器中。您应该能够测试存根是否适用于:Org.first.valid?Org.new(valid_attibutes).valid?. 例如,如果mocha你的stubbing 会被破坏Gemfile,因为在这种情况下any_instance将是一个mocha对象,并且 rspecstub将无法处理它。如果存根有效,您可以使用日志记录或调试器调试控制器中发生的情况。

对于存根错误,您可以执行以下操作:

Org.any_instance.stub(:errors).and_return(ActiveModel::Errors.new(Org.new).tap {
  |e| e.add(:name,"cannot be nil")})

或者,如果控制器仅使用errors.full_messages,那么您可以:

Org.any_instance.stub_chain("errors.full_messages").and_return(["error1","error2"])
于 2014-04-11T00:37:16.333 回答
1

你应该存根有效吗?方法:

Org.any_instance.stubs(:valid?).and_return(false)

那么您的对象将不会被保存,因为它将无效

于 2012-07-03T19:59:16.073 回答
0

FWIW,我使用的是严格的save!(验证失败时会引发错误)。
对于这种情况,我使用了:

  allow_any_instance_of(ReportFile).to receive(:save!).and_raise(
    ActiveRecord::RecordInvalid, ReportFile.new.tap do |rf|
      rf.errors.add(:data_file_size, 'must be less than 100 Megabytes')
    end
  )
于 2020-04-17T01:26:20.597 回答