RSpec 期望类 to_not 接收带有特定参数的方法

问题描述

我正在使用以下版本的 Ruby、RSpec 和 Rails

ruby (2.3.2)
rails (~> 5.0,>= 5.0.0.1)
rspec-core (3.5.4)
rspec-expectations (3.5.0)
rspec-mocks (3.5.0)
rspec-rails (3.5.2)

我有一个方法,如下所示:

MyClass
  class << self
    def update_obj(model_obj_id:,updatable_attrs:)
      model_obj = MyUpdateService.update_obj(model_obj_id,updatable_attrs)

      if model_obj.errors.present?
        # Log errors.
        return
      end

      model_obj    
    end
  end
end

在我的业务工作流中,上述方法被多次调用 具有不同的 model_obj_id。现在在测试中,我正在为工作流程编写代码 我有一个需要,我需要设置一个期望,其中我不希望使用特定的 MyClass.update_obj 调用 model_obj_id,如下所示:

my_model_obj = find_model_obj

expect(MyClass).to_not(
  receive(:update_obj)
  .with(model_obj_id: my_active_record_model_obj.id,updatable_attrs: instance_of(Hash))
)

subject.process_update

但是,当我以这种期望运行示例时,我遇到了以下错误

 Failure/Error: if model_obj.errors.present?
 
 NoMethodError:
   undefined method `errors' for nil:NilClass

查看错误,我认为由于我没有在模拟中设置返回值,因此对于预期为 model_obj_id调用会返回错误。例如。对于 ID 为 10 的 obj 我希望调用 MyClass.update_obj 但对于 ID 为 15 的 obj 不应该。错误似乎是由使用 MyClass.update_obj 调用model_obj_id: 10 引发的。

所以基本上我希望期望仅适用于特定的 model_obj_id,而对于其他人,它应该调用原始实现。

有人可以帮我设置期望的期望值吗?

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)