【问题标题】:Expecting errors in rspec tests预期 rspec 测试中的错误
【发布时间】:2010-03-01 22:06:54
【问题描述】:

我试图预计 rspec 测试中会出现错误。

lambda {Participant.create!({:user_id => three.id, :match_id => match.id, :team => 1})}.should raise_error StandardError

现在我只是使用StandardError 来确保它正常工作。

1) StandardError in 'Participant should never allow more participants than players'. 
   This game is already full.  Cannot add another player.
/home/josiah/Projects/Set-Match/app/models/participant.rb:12:in `do_not_exceed_player_count_in_match'
./spec/models/participant_spec.rb:24:

它显然会抛出错误,但我的测试仍然失败。

想法?

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

    从一段时间以来,但至少在 RSpec 2.5 中,可以使用

    expect {raise 'boom'}.to raise_error(RuntimeError, /boom/)
    

    【讨论】:

      【解决方案2】:

      您的语法看起来是正确的。要对此进行调试,请简化以确保您的规范编码正确。

      it "should raise an error" do
        lambda {raise "boom"}.should raise_error
      end
      

      然后添加更多细节直到它崩溃。

      lambda {raise "boom"}.should raise_error(RuntimeError)
      lambda {raise StandardError.new("boom")}.should raise_error(StandardError)
      

      【讨论】:

        【解决方案3】:

        我不得不与同样的症状作斗争:

        def boom
          raise "boom"
        end
        boom.should raise_error
        

        上面的测试失败了,因为raise_error 需要在Proc 上调用should(我想是由于技术原因)。因此,用 lambda 包装方法调用就可以了:

          lambda { boom }.should raise_error
        

        不幸的是,文档没有明确说明,并且没有 RSpec 异常可以揭示这种行为。有一个two year old ticket。

        【讨论】:

        • "boom.should raise_error" 失败,因为在执行“应该”之前对景气进行了评估;另一方面,lambda 由“应该”本身调用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多