ruby-on-rails – 在rspec中存根未实现的方法

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在rspec中存根未实现的方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在测试我的模块,我决定测试它与匿名类:
subject(:klass) { Class.new { include MyModule } }

MyModule在klass中使用方法名称.为了让我的规范工作,我需要存根这个方法名称(未实现).所以我写道:

subject { klass.new }
allow(subject).to receive(:name).and_return('SOreadytohelp') }

但它引起了:

RSpec::Mocks::MockExpectationError: #<#<Class:0x007feb67a17750>:0x007feb67c7adf8> does not implement: name
from spec-support-3.3.0/lib/rspec/support.rb:86:in `block in <module:Support>'

如何在不定义的情况下存根此方法

解决方法

RSpec引发了这个异常,因为对原始对象上不存在的方法进行存根是没有用的.

模拟方法总是容易出错,因为模拟可能与原始实现的行为不同,因此即使原始实现返回错误(或甚至不存在),规范也可能成功.允许模拟不存在的方法是完全错误的.

因此,我认为你不应该试图绕过这个例外.只需在您的类中添加一个名称方法,如果在测试环境之外运行,则会引发明确的异常:

def self.name
  raise NotImplementedError  # TODO: check specs...
end

猜你在找的Ruby相关文章