首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不同实例上使用不同的参数测试同一方法的接收

如何在不同实例上使用不同的参数测试同一方法的接收
EN

Stack Overflow用户
提问于 2017-07-20 07:38:01
回答 1查看 276关注 0票数 2

我有我的方法

代码语言:javascript
复制
def my_method
  MyClass.new.track(arg1, arg2)

  if satisfies_some_condition
    2.times { MyClass.new.track(arg3, arg4) }
  end
end

RSpec中,我想测试#track的接收

代码语言:javascript
复制
expect_any_instance_of(MyClass).to receive(:track).with(arg1, arg2)
expect_any_instance_of(MyClass).to receive(:track).with(arg3, arg4).twice

但我发现了这个错误

消息“跟踪”已被#<MyClass:70362069595680 >接收,但已被#<MyClass:0x007ffce788e460>接收

这里似乎建议通过升级到RSpec-mocks v3.6.0来解决这个问题,但是即使在将RSpec-mocks gem升级到v3.6.0之后,我仍然会遇到同样的错误

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-20 08:07:58

我从来没有喜欢过any_instance,所以我不知道如何用它来做你想做的事情,然而,一个可以做你想做的事情的替代方案是这样的

代码语言:javascript
复制
class MyClass
  def track(a, b)
  end
end

def my_method(pass = true)
  MyClass.new.track('a', 'b')

  if pass
    2.times { MyClass.new.track('c', 'd') }
  end
end

RSpec.describe "SO question" do
  it 'pass' do
    first = double(MyClass)
    expect(first).to receive(:track).with('a', 'b')
    second = double(MyClass)
    expect(second).to receive(:track).with('c', 'd').twice

    allow(MyClass).to receive(:new).and_return(first, second)
    my_method
  end

  it 'fail' do
    first = double(MyClass)
    expect(first).to receive(:track).with('a', 'b')
    second = double(MyClass)
    expect(second).to receive(:track).with('c', 'd').twice

    allow(MyClass).to receive(:new).and_return(first, second)
    my_method(false)
  end
end

更详细一些,但是强制new方法返回对它们有期望的多个实例。每次调用时,and_return都会按顺序返回这些值,然后继续返回任何额外调用的最后一个值。

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

https://stackoverflow.com/questions/45208349

复制
相关文章

相似问题

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