我想要一种检查方法是否引发错误的方法
我尝试了以下方法:
expect(described_class.new.convert_to_pdf).to raise_error
class Invoice
    def self.convert_to_pdf
        "Yay"
    end
end
RSpec.describe Invoice do
    describe '#convert_to_pdf' do
        it "Should work" do 
            expect(described_class.convert_to_pdf).to eql("Yay")
        end
        it "should not work on object" do 
            expect(described_class.new.convert_to_pdf).to raise_error
        end
    end
end
Run Code Online (Sandbox Code Playgroud)
我想让两个测试都通过,因为我想向我的同事解释这个类方法和实例方法有何不同
请参考我的错误:
1)Invoice#convert_to_pdf在对象失败/错误上不起作用:(describe_class.new.convert_to_pdf)。应该引发错误
 NoMethodError:
   undefined method `convert_to_pdf' for #<Invoice:0x007fa48e2b2ac0>
 # ./methods.rb:91:in `block (3 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)
    它很微妙,但是有两种定义expect定义的方法。第一个是您提供值或表达式的位置:
expect(x).to be_something
Run Code Online (Sandbox Code Playgroud)
在这里,表达式将立即被求值,然后expect才有机会做它的事情。
实际上,您的代码如下所示:
x = described_class.new.convert_to_pdf # Exception happens here
expect(x).to raise_error # Too late, already popped an exception
Run Code Online (Sandbox Code Playgroud)
第二种形式是您提供块的位置:
expect { x }.to raise_error
Run Code Online (Sandbox Code Playgroud)
此处,该块由其expect自身评估,并且能够捕获和检查所生成的任何错误。
使用时,raise_error您需要块形式,否则异常将漏过expect的救援机制。