我正在学习rspec,并且已经编写了规范,但部分失败

0 ruby rspec

我想要一种检查方法是否引发错误的方法

我尝试了以下方法:

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)

tad*_*man 7

它很微妙,但是有两种定义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的救援机制。