Fil*_*uzi 9 ruby rspec ruby-on-rails ruby-on-rails-4
我正在测试我的模块,我决定测试它与匿名类:
subject(:klass) { Class.new { include MyModule } }
Run Code Online (Sandbox Code Playgroud)
MyModule使用name里面的方法klass.为了让我的规范工作,我需要存根这个方法name(未实现).所以我写道:
subject { klass.new }
allow(subject).to receive(:name).and_return('SOreadytohelp') }
Run Code Online (Sandbox Code Playgroud)
但它引起了:
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>'
Run Code Online (Sandbox Code Playgroud)
如何在不定义的情况下存根此方法?
RSpec引发此异常,因为对原始对象上不存在的方法存根没有用.
模拟方法总是容易出错,因为模拟的行为可能与原始实现不同,因此即使原始实现返回错误(或甚至不存在),规范也可能成功.允许模拟不存在的方法是完全错误的.
因此,我认为你不应该试图绕过这个例外.只需name在您的类中添加一个方法,如果在测试环境之外运行,则会引发明确的异常:
def self.name
raise NoMethodError # TODO: check specs...
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7652 次 |
| 最近记录: |