Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 我正在学习rspec,我已经编写了一个规范,但部分失败_Ruby_Rspec - Fatal编程技术网

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