使用rspec测试对象的方法,该对象是对象的属性

时间:2013-09-25 18:10:35

标签: ruby rspec tweetstream

如果我有这样的方法:

require 'tweetstream'

# client is an instance of TweetStream::Client
# twitter_ids is an array of up to 1000 integers
def add_first_users_to_stream(client, twitter_ids)
    # Add the first 100 ids to sitestream.
    client.sitestream(twitter_ids.slice!(0,100))

    # Add any extra IDs individually.
    twitter_ids.each do |id|
        client.control.add_user(id)
    end

    return client
end

我想用rspec来测试:

    调用
  • client.sitestream,前100个Twitter ID。
  • 使用剩余的ID调用
  • client.control.add_user()

对我来说第二点是最棘手的 - 我无法弄清楚如何在一个对象上存根(或者其他),该对象本身就是一个对象的属性。

(我在这里使用Tweetstream,虽然我希望答案可能更为一般。如果有帮助,client.control将成为TweetStream::SiteStreamClient的实例。)

(我也不确定像我的例子这样的方法是最佳做法,接受并返回client这样的对象,但我一直试图打破我的方法,以便它们更可测试。)

1 个答案:

答案 0 :(得分:1)

对于RSpec来说,这实际上是一个非常简单的情况。以下内容将起作用:

describe "add_first_users_to_stream" do
  it "should add ids to client" do

    bulk_add_limit = 100
    twitter_ids = (0..bulk_add_limit+rand(50)).collect { rand(4000) }
    extras = twitter_ids[bulk_add_limit..-1]

    client = double('client')
    expect(client).to receive(:sitestream).with(twitter_ids[0...bulk_add_limit])

    client_control = double('client_control')
    expect(client).to receive(:control).exactly(extras.length).times.and_return(client_control)
    expect(client_control).to receive(:add_user).exactly(extras.length).times.and_return {extras.shift}

    add_first_users_to_stream(client, twitter_ids)

  end
end