0

如果我有这样的方法:

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。
  • client.control.add_user()使用剩余的 ID 调用。

第二点对我来说是最棘手的——我不知道如何存根(或其他)对象上的方法,该对象本身就是对象的属性。

(我在这里使用Tweetstream,尽管我希望答案可能更笼统。如果有帮助,client.control将是一个实例TweetStream::SiteStreamClient。)

(我也不确定像我的示例这样的方法是否是最佳实践,接受并返回这样的client对象,但我一直在尝试分解我的方法,以便它们更具可测试性。)

4

1 回答 1

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
于 2013-09-25T19:12:51.080 回答