【问题标题】:Rails + Rspec: How to stub a record so that it's marked as invalid?Rails + Rspec:如何存根记录以将其标记为无效?
【发布时间】:2016-12-03 18:14:41
【问题描述】:

我有一个带有方法的Purchase 模型:

def set_status_to_in_progress!
  self.update_attributes!(status: IN_PROGRESS)
end

还有一个失败的 rspec 测试:

context "self is invalid" do
  it "raises an error" do
    purchase = Purchase.new
    purchase.stub(:valid?).and_return(:false)
    expect { purchase.set_status_to_in_progress! }.to raise_error
  end
end

返回

Failures:

      1) Purchase#set_status_to_in_progress! self is invalid raises an error
         Failure/Error: expect { purchase.set_status_to_in_progress! }.to raise_error
           expected Exception but nothing was raised
         # ./spec/models/purchase_spec.rb:149:in `block (4 levels) in <top (required)>'

我认为存根 valid? 足以使 ActiveRecord update_attributes! 方法引发错误?我要如何让它加注?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    尝试将 :false 更改为 false

    purchase.stub(:valid?).and_return(false)
    

    purchase.should_receive(:valid?).and_return(false)
    

    否则你可以存根购买的任何实例

    Purchase.any_instance.should_receive(:valid?).and_return(false)
    

    【讨论】:

    • 所以问题是因为我有 ...and_return(:false) 一个符号而不是 false 布尔值。所以`purchase.stub(:valid?).and_return(false) 有效
    【解决方案2】:

    这是DEFINITIVE指南,可在无法在模型上使用真实验证进行模拟时成功测试验证错误。在我的情况下,SupportRequest 模型没有任何验证,但我想像有一个一样进行测试,所以我首先创建一个双精度然后使其在尝试更新时返回 false,然后在记录中添加错误并最后测试记录在那里。 :)

    describe "with invalid data" do
      before do
        the_double = instance_double("SupportRequest", id: support_request.id)
        active_model_errors = ActiveModel::Errors.new(the_double).tap { |e| e.add(:description, "can't be blank") }
        allow_any_instance_of(SupportRequest).to receive(:update_attributes).and_return(false)
        allow_any_instance_of(SupportRequest).to receive(:errors).and_return(active_model_errors)
        put "/api/support_requests/#{support_request.id}",
          params: {
            data: {
              type: "support-requests",
              attributes: {}
            }
          },
          headers: authenticated_header(support_agent)
      end
    
      it "should not create a new support_request" do
        expect_json(errors: [
          {
            source: {
              pointer: "/data/attributes/description"
            },
            detail: "can't be blank"
          }
        ])
      end
      it "should return status code (422)" do
        expect_status(422)
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      相关资源
      最近更新 更多