如果我有这样的方法:
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()
。对我来说第二点是最棘手的 - 我无法弄清楚如何在一个对象上存根(或者其他),该对象本身就是一个对象的属性。
(我在这里使用Tweetstream,虽然我希望答案可能更为一般。如果有帮助,client.control
将成为TweetStream::SiteStreamClient
的实例。)
(我也不确定像我的例子这样的方法是最佳做法,接受并返回client
这样的对象,但我一直试图打破我的方法,以便它们更可测试。)
答案 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