On 9 Jan 2010, at 12:02, David Chelimsky wrote:
On Fri, Jan 8, 2010 at 9:37 PM, DeNigris Sean
<s...@clipperadams.com> wrote:
Hi list,
I'm writing an example for a class that represents the "pickaxe" e-
book, which I view in Preview.app:
describe PickaxeBook do
...
it "should tell whether it's ready to read" do
preview = stub('preview')
preview.stub!(:******this is what I'm not sure about
- see below*******).returns("programming_ruby_1.9.pdf")
my_pickaxe_book = PickaxeBook.new(preview)
my_pickaxe_book.should be_ready_to_read
end
end
class PickaxeBook
...
def ready_to_read?
#****** this is the dependency I want to stub:
preview.front_window.title ********
preview.front_window.title =~ /
programming_ruby_1.9\.pdf.*/
end
end
Can you see the problem? ready_to_read wants to query the object
returned by front_window, but how do I stub that? I should note
that the Preview class is in a different library, which is why I
don't just change front_window.title
I thought of a few things, like introducing a role (something like
"PreviewInfoRetriever") with a method "front_window_title" that
forwards to preview.front_window.title, but that seems like a lot of
complexity.
To summarize: what's the best way to handle a dependency like
object.method.method?
There is no universally best way. Stubbing it is fairly
straightforward:
window = stub('window', :title => "programming_ruby_1.9.pdf")
preview = stub('preview', :front_window => window)
The risk is that this example is now bound to the internal structure
of an object provided by a 3rd party, which can change in a future
release. If that happened, this example might continue passing with
a false positive, and the app won't work.
If you have good high level specs with something like Cucumber or
FitNesse, this risk is diminished. You'll still have to change the
example when the internal structure of Preview changes, but you're
less likely to get burned by deploying code that passes its tests
but doesn't work.
If it's easy and inexpensive to create a real instance of Preview,
I'd sooner do that.
Or wrap the Preview object with your own (maybe PreviewWindow?) and
offer a #has_title? method on that wrapper.
HTH,
David
Thanks!
Sean DeNigris
s...@clipperadams.com
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users
cheers,
Matt
http://mattwynne.net
+447974 430184
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users