Ruby on rails 如何使用Rspec测试调用了“discard_on”的rails 6?
我有一个作业,它应该放弃一个特定的错误:Ruby on rails 如何使用Rspec测试调用了“discard_on”的rails 6?,ruby-on-rails,rspec,rails-activejob,Ruby On Rails,Rspec,Rails Activejob,我有一个作业,它应该放弃一个特定的错误: class SomeJob
class SomeJob
我尝试过,基于模拟测试,如下所示:
context'#放弃'do'
它“应该在Errno::enoint error”上放弃
期望(描述的类)的任何实例接收(:执行)和提升(Errno::enoint.new)
期望(SomeJob).接收到(放弃打开)
上传作业。立即执行(**args)
结束
结束
但我一直得到以下错误:
#预期已在上收到discard_,但该对象不是间谍或方法未被存根。
如果我这样尝试:
期望(SomeJob.)的任何实例接收(:执行)和提升(Errno::enoint)
期望(描述的类)的任何实例接收(:discard\u on)
SomeJob.perform_now(**args)
它失败,出现以下错误:
SomeJob未在上实现#放弃#
是一种类方法。这根本不起作用,因为在引发异常时它实际上没有被调用。它只是一个宏方法,使用rescue\u from
设置异常处理程序。我建议您研究一种不同的方法来测试行为,而不是深入内部。的任何实例都被认为是非常糟糕的代码味道,这是有原因的。谢谢@max。所以我应该测试发生在块内的事情是否应该调用?另外,为什么的任何实例都是一种代码气味?这已经解释清楚了。是的。测试代码的功能(例如不创建记录或记录错误),而不是测试代码的功能。如果perform正在调用其他方法,则可以模拟其中一个方法以引发错误,然后在perform上不断言任何引发的内容。但是我完全同意@max,这是一种测试,Rails正在做应该做的事情……你没有得到很多。