加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 使用RSpec在块中包装的测试方法

发布时间:2020-12-16 19:13:58 所属栏目:百科 来源:网络整理
导读:在我的实际操作的简化示例中,假设我有2次调用数据库: Repo.add( something_stringy )Repo.remove( something_floaty ) 我想使用模拟数据库调用,因为真正的调用将在其他地方测试: let(:repo){ repo = double("Repo") repo.should_receive(:add).with(instan
在我的实际操作的简化示例中,假设我有2次调用数据库:
Repo.add( something_stringy )
Repo.remove( something_floaty )

我想使用模拟数据库调用,因为真正的调用将在其他地方测试:

let(:repo){
  repo = double("Repo")
  repo.should_receive(:add).with(instance_of(String))
  repo.should_receive(:remove).with(instance_of(Float))
  repo
}

before { FakeKlass.const_set :Repo,repo }

这一切都很好,花花公子,但现在如果我在一个事务中包装调用我有点难过:

Repo.transaction do
  # ... some error checking in here somewhere...
  Repo.add( something_stringy )
  Repo.remove( something_floaty )
end

因为如果我写一个接收事务的模拟它将接收调用,但块中的所有内容都不会被调用,我得到:

expected: 1 time
received: 0 times

对于所有其他的嘲笑.有人能告诉我如何编写我的规范来处理这个问题吗?我已经尝试阅读RSpec书中的相关页面(:每个)但这对我来说就像泥巴一样清晰.

任何帮助深表感谢.

解决方法

您可以使用#and_yield从期望链中获取:
repo.should_receive( :transaction ).and_yield

您也不需要在Repo类上设置double to stub out方法.例如,您的设置可以写成:

before( :each ) do
    Repo.should_receive( :transaction ).and_yield
    Repo.should_receive( :add ).with( instance_of(String) )
    Repo.should_receive( :remove ).with( instance_of(Float) )
end

您也可以考虑使用stub而不是should_receive,因为它没有设置期望:

before( :each ) do
    Repo.stub( :transaction ).and_yield
    Repo.stub( :add )
    Repo.stub( :remove )
end

通常,当您要测试两个对象之间的交互时,应该只使用should_receive.我个人的经验法则是,如果它出现在之前,使用存根;如果它是一个例子,特别是具有特定值,请使用should_receive.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读