ruby-on-rails - RSpec - stub 实例方法

标签 ruby-on-rails ruby rspec mocking

我在项目中间添加了以下方法:

def finishes_after_venue_shuts?
  return unless venue && finish
  day = regular_day ? regular_day : start.strftime('%a').downcase
  finish > venue.openingtimes.where(default_day: day).pluck(:finish)[0]
end

这导致项目中 1000 多个测试失败。他们因以下错误代码而失败:
ArgumentError:
  comparison of ActiveSupport::TimeWithZone with nil failed

我试图按如下方式排除该方法,但显然我做错了什么:
before do
  allow(Event.any_instance).to receive(:finishes_after_venue_shuts?).and_return(false)
end

删除方法并简单地返回 false 而不是执行代码的正确语法是什么?

提前致谢。

最佳答案

你很接近:)

allow_any_instance_of(Event)
  .to receive(:finishes_after_venue_shuts?)
  .and_return(false)
但是使用 allow_any_instance_of被认为是一种不好的做法,所以更合适的是使用 double:
let(:event) { instance_double(Event, finishes_after_venue_shuts?: false) }

allow(Event).to receive(:new).and_return(event)

关于ruby-on-rails - RSpec - stub 实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42000119/

相关文章:

jquery - 删除方法在 Rails 中不起作用

ruby - 在 Digest::MD5.digest 和 Digest::MD5.hexdigest 之间转换

ruby-on-rails - 使用 open_id_authentication 插件时,如何在 RSpec 用户故事/Cucumber 中伪造 OpenID 登录

ruby-on-rails - 比 if 语句更好的数据结构来多次检查变量?

ruby-on-rails - rails belongs_to 可选,但如果通过则检查是否存在

ruby-on-rails - 坚持如何在数组中使用 .first 和 .last

ruby-on-rails - rails : How do I write a spec for a route that does a redirect?

ruby-on-rails - 通过 rails 中的链接获取标题和内容

ruby-on-rails - Bower 在 Angular on Rails 应用程序中找不到包

ruby-on-rails - 在使用Capybara时调整Chrome窗口的大小