ruby - 使用 Rspec 监视实例方法

标签 ruby rspec

我有一个包含多种方法的类,例如

class MyClass
  def method_a(p)
    method_b if p == 1
  end

  def method_b
    some_more_stuff
  end
end

我希望使用 RSpec 测试 method_a(有时)调用 method_b

it 'calls method_b if the passed parameter is 1' do
  instance = spy('MyClass')

  instance.method_a(1)

  expect(instance).to have_received(:method_b)
end

不幸的是,由于 RSpec spy 不会将方法调用传递给他们正在监视的对象,因此 spy.method_a 实际上不会调用 spy.method_b。我尝试过使用 double 和实例 double ,但现在非常困惑。

如何让 RSpec double 或 spy 或其他实例对象观察实例的内部方法调用而不完全替换它们?我愿意以某种方式模拟 method_b,但也不知道如何正确地做到这一点。

最佳答案

通常我不建议以这种方式测试事情,因为方法调用完全是内部的事情。请记住,RSpec 是BDD 框架,而 BDD 与内部事物无关。

但是,我知道有时我们想使用模拟和 stub 来测试内部事物。因此,这是一个示例代码:

RSpec.describe MyClass do
  it 'calls method_b if the passed parameter is 1' do
    instance = MyClass.new
    expect(instance).to receive(:method_a).and_call_original
    expect(instance).to receive(:method_b)

    instance.method_a(1)
  end
end

关键部分是我们实际上实例化MyClass,以便我们可以使用 and_call_original方法仅适用于 partial test doubles .

关于ruby - 使用 Rspec 监视实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60859122/

相关文章:

ruby-on-rails - 如何确保该表不包含重复项(基于两个外键)?

ruby - 使用 ruby​​ 规范化数据集

ruby - 如何在之前访问标签过滤器(:suite)/before(:all) hook in RSpec?

html - 使用 capybara 点击基于 ID 的链接

Ruby 要求 'tk' 产生 LoadError : no such file to load -- tk

css - 使用 rails collection_select 表单助手更改 'include_blank' 文本的样式

ruby-on-rails - ruby 在 rails 上。通过 View 更改 Controller 的变量并渲​​染更新的 View

RSpec:如何测试 :new 是否在类 double 上被调用

ruby-on-rails - have_selector 测试失败

ruby-on-rails - Rspec - 如何在每次测试后清理数据库