班级结构:
class Service1
  def foo
    puts 'foo'
  end
end
class Service2
  def bar
    3.times.each do 
      Service1.new().foo
    end
  end
end我想测试一下,bar方法的Service2被调用3次。
如何在rspec3中做得最好?
发布于 2022-01-27 09:23:49
我会将代码重构为:
class Service1
  def self.foo
    new.foo
  end
  def foo
    puts 'foo'
  end
end
class Service2
  def bar
    3.times.each do 
      Service1.foo
    end
  end
end然后使用像这样的规范
describe "#bar" do
  let(:service1) { class_double("Service1") }
  it "calls Service1.foo three times" do
    expect(service1).to receive(:foo).exactly(3).times
    Service2.bar
  end
end发布于 2022-01-27 09:40:11
您可以通过模拟new方法来实现这一点。
class Service1
  def foo
    puts 'foo'
  end
end
class Service2
  def bar
    3.times.each do 
      Service1.new().foo
    end
  end
end然后是测试:
let(:mocked_service) { instance_spy Service1 }
it "calls Service1.foo three times" do
  allow(Service1).to receive(:new).and_return mocked_service
  Service2.bar
  expect(mocked_service).to have_received(:foo).exactly(3).times
end然而,正如评论中提到的--使用模仿的必要性是OO设计缺陷的第一个迹象,这意味着您发布的问题仅仅是一个症状。参考坚实的原则,找到更好的设计。
https://stackoverflow.com/questions/70875197
复制相似问题