首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rspec,如何使用多个服务调用测试方法?

Rspec,如何使用多个服务调用测试方法?
EN

Stack Overflow用户
提问于 2022-01-27 08:08:21
回答 2查看 660关注 0票数 1

班级结构:

代码语言:javascript
运行
复制
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中做得最好?

EN

回答 2

Stack Overflow用户

发布于 2022-01-27 09:23:49

我会将代码重构为:

代码语言:javascript
运行
复制
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

然后使用像这样的规范

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2022-01-27 09:40:11

您可以通过模拟new方法来实现这一点。

代码语言:javascript
运行
复制
class Service1
  def foo
    puts 'foo'
  end
end

class Service2
  def bar
    3.times.each do 
      Service1.new().foo
    end
  end
end

然后是测试:

代码语言:javascript
运行
复制
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设计缺陷的第一个迹象,这意味着您发布的问题仅仅是一个症状。参考坚实的原则,找到更好的设计。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70875197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档