【问题标题】:RSpec -- test if method called its block parameterRSpec -- 测试方法是否调用了它的块参数
【发布时间】:2012-10-26 07:06:51
【问题描述】:

我有一个将代码块作为参数的方法。问题是:如果这个方法调用了块,如何使用 RSpec 进行测试?

可以在方法所需的任何范围内评估块,不一定使用yieldblock.call。它被传递给另一个类,或者在匿名类对象或其他地方对其进行评估。为了使测试通过,作为方法调用的结果,在某处评估块就足够了。

有没有办法使用 RSpec 测试类似的东西?


另请参阅this,了解更复杂的情况,使用lets 和模拟。

【问题讨论】:

  • 创建一个有副作用的块,比如设置一个封闭的变量我们引发一个异常,并检查副作用?
  • 感谢您的建议!尤其是在这种情况下,例外的概念很有前景。

标签: ruby methods rspec call block


【解决方案1】:

我喜欢使用throw 而不是raise 来解决这类问题,因为它不能被任意救援处理程序救援。所以它可能看起来像这样:

my_proc = proc { throw :my_proc_was_called }
expect {
  my_proc.call
}.to throw_symbol :my_proc_was_called

【讨论】:

    【解决方案2】:

    我通常会做类似的事情

    a = 1
    b.go { a = 2}
    a.should == 2
    

    【讨论】:

    • 这个也可以!简单有效!谢谢 ;-) 还在should 测试中添加了附加消息以防止混淆,例如here
    【解决方案3】:

    感谢 Dave Newton 在上面评论中的建议,我做了这样的事情:

     it "should run block defining the node" do
       message="This message is raised if block is properly evaluated."
       expect do
         node do
           raise message
         end 
       end.to raise_error message
     end
    

    如果出现错误,则会打印消息:

     Failure/Error: expect do
       expected Exception with "This message is raised if block is properly evaluated." but nothing was raised
    

    我觉得信息量足够大。

    再次感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      相关资源
      最近更新 更多