Rspec ::允许每个实例接收消息

时间:2015-03-26 05:58:51

标签: ruby-on-rails ruby testing rspec mocking

我想为一个类的每个实例模拟一个方法。 如果我allow_any_instance_of,那么如果instance_count = 1

则效果很好

但是,如果我有许多同一个类的实例,则第二个实例不会被模拟捕获。

我试图从不同的网站获得一堆令牌。但在测试过程中,我并不需要“真正的”令牌。所以我打算模拟get_token返回'1111'。

class Foo
  def children
     [Bar.new, Bar.new] #....
  end
  def get_tokens
     children.map(&:get_token) || []
  end
end

所以现在我怎么不嘲笑get_tokens?

1 个答案:

答案 0 :(得分:1)

这样的解决方案怎么样:

require "spec_helper"
require "ostruct"

class Bar
  def get_token
    ("a".."f").to_a.shuffle.join # simulating randomness
  end
end

class Foo
  def children
    [Bar.new, Bar.new, Bar.new]
  end

  def get_tokens
    children.map(&:get_token) || []
  end
end

RSpec.describe Foo do
  before do
    allow(Bar).to receive(:new).and_return(OpenStruct.new(get_token: "123"))
  end

  it "produces proper list of tokens" do
    expect(Foo.new.get_tokens).to eq ["123", "123", "123"]
  end
end

我们在new上隐藏Bar方法,以get_token返回 quacks (因此它的行为类似于{ {1}}),它返回一个固定的字符串。这是你可以继续的东西。

希望有所帮助!