Ruby 我正在学习rspec,我已经编写了一个规范,但部分失败
我想要一种检查方法是否引发错误的方法 我尝试了以下方法:Ruby 我正在学习rspec,我已经编写了一个规范,但部分失败,ruby,rspec,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.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
我希望这两个测试都能通过,因为我想向我的同事解释类方法和实例方法的区别
请参考我的错误:
1) 发票#将#转换为#pdf不适用于对象
失败/错误:(已描述\u类。新建。将\u转换为\u pdf)。应引发\u错误
NoMethodError:
undefined method `convert_to_pdf' for #<Invoice:0x007fa48e2b2ac0>
# ./methods.rb:91:in `block (3 levels) in <top (required)>'
命名错误:
未定义的方法“转换为pdf”#
#方法:rb:91:in‘block(3层)in’
这很微妙,但定义的方法有两种:expect
定义。第一个是提供值或表达式的位置:
在这里,表达式会立即求值,只有到那时,expect
才有机会执行它的操作
实际上,您的代码如下所示:
x = described_class.new.convert_to_pdf # Exception happens here
expect(x).to raise_error # Too late, already popped an exception
第二种形式是提供块的形式:
其中,块由expect
本身进行评估,并能够捕获和检查生成的任何错误
使用raise\u error
时,您需要块形式,否则异常将滑过expect
的救援机制。您可以使用测试方法是否在类和/或实例上定义:
RSpec.describe Invoice do
describe '#convert_to_pdf' do
it "should work on class" do
expect(described_class).to respond_to(:convert_to_pdf)
end
it "should not work on instance" do
expect(described_class.new).to_not respond_to(:convert_to_pdf)
end
end
end
这样:
- 不会出现任何错误
- 两项测试都将通过,并且
- 您可以解释方法的定义位置
希望有帮助。请编辑详细说明,“我已经尝试了以下内容”。有什么问题吗?是否提出了例外情况?如果是这样,错误消息是什么?它发生在哪一行?测试类方法在对象上不起作用是一个非常不寻常的测试。您不应该测试不存在的方法,因为它们不存在,也不需要测试。例外情况是,如果它们应该存在,并且您希望测试失败作为提醒。@CarySwoveland请参阅错误发票#convert_to_pdf不适用于对象失败/错误:(已描述的类。新建。convert_to_pdf)。应提出错误名称错误:未定义的方法“转换为pdf”,因为信息是问题的核心,所以它应该是问题的一部分,而不是在评论中。请编辑。别忘了说出哪一行代码引发了异常。别忘了选择你认为最有用的答案,除非它们对你都没有帮助。谢谢@tadman它起作用了,我学到了一些新东西:)干杯,伙计!
expect { x }.to raise_error
RSpec.describe Invoice do
describe '#convert_to_pdf' do
it "should work on class" do
expect(described_class).to respond_to(:convert_to_pdf)
end
it "should not work on instance" do
expect(described_class.new).to_not respond_to(:convert_to_pdf)
end
end
end