[rspec-users] stubbing a method that yeilds sequential results
rupert
rupert_apsc at rupespad.com
Sun Aug 12 06:34:28 EDT 2007
I've just found myself stuck trying to rspec something so am hoping
someone more knowledgable can help.
I have a Connector class which has a class method 'results' that
yields results it get from a network service based on a set of
attributes that I pass to it. I am wanting to yield these results
from my Intermediate class up to the next 'level' so the basic no
frills set up would be this:
class Intermediate
def self.results(attributes)
Connector.each_result(attributes) do |result|
yield result
end
end
end
I've worked out how to stub things for the case where the Connector.
each_result method yields a result once
#setup
@result = mock("result")
Connector.stub!(:each_result).and_yield(@result)
@attributes = {}
@results = []
@block = Proc.new { |r| @results << r }
#action
Intermediate.search_results(@attributes, &@block)
# expectation
@results.should == [@search_result]
However, what I actually need to do is check each result that is
yielded by the Connector.each_result method and compare it to the
previous one. If they are sufficiently similar I need to merge them
(and same again if the next result is sufficiently similar). I only
want to yeild merged results and results that are not similar to
their preceeding result(s) - I'd imagined he code to do this would be
something along the lines of:
class Intermediate
def self.results(attributes)
@saved_result = nil
Connector.each_result(attributes) do |result|
if results_match(result, @saved_result)
@saved_result.merge!(result)
else
yield @saved_result unless @saved_result.nil?
@saved_result = result
end
end
yield @saved_result unless @saved_result.nil?
end
def results_match(this, last)
return false if last.nil?
....
end
end
I can't for the life of me see how I should spec this though, as trying:
Connector.stub!(:results).and_yield(@result1, @result2)
is expecting the two results to be yielded at the same time and not
sequentially. I can't see how to stub a method to yield sequential
results so I can spec the behavior for different scenarios of
similarities between subsequent results. Is it possible to do this?
Any help would be much appreciated
Cheers
Rupert
More information about the rspec-users
mailing list