On 30 Aug 2011, at 00:09, Alex Chaffee wrote:

> I do. So often that I wrote a helper and put it in Wrong.

Cool, and also… I really should try Wrong! I've just put it on my project TODO 
list as something to investigate

> I don't quite get what "stream_bundle.captured_error" is in your
> example, but I think the above example would become
> 
> rescuing {
>  run_command(%w[ missing_wallet.dat ])
> }.message.should == "Couldn't find whatever"
> 
> We've also got "capturing" for grabbing console output, e.g.
> 
> capturing { puts "hi" }.should == "hi"

Sorry, I didn't realise how opaque that is if you don't know what one is.

Basically, I wanted to decouple the app from STDIN/STDOUT/STDERR so I started 
injecting StringIO objects around for testing. After a while I had a data clump 
of @input/@output/@error in classes everywhere, so I made a StreamBundle[1] to 
encapsulate them. (Apologies for lack of syntax highlighting on patch-tag.com)

But then I realised my tests were making a `StreamBundle.new(StringIO.new, 
StringIO.new, StringIO.new)` everywhere, so I factored out the duplication into 
a CapturingStreamBundle[2] decorator that records all output to secondary 
StringIO objects. Now I just call `CapturingStreamBundle.test_bundle` to get 
one.

I've found this pattern useful as now that only files in my bin/ folder ever 
access ARGV, STDOUT etc, the code is more loosely coupled, but also I can see 
exactly where I'm talking to the outside world. Every time I want to send some 
output, I think- "Should I really be giving this object a StreamBundle? Is it 
really appropriate for it to be talking to the user directly?"

That's the backstory anyway!

Ash

[1] 
https://patch-tag.com/r/ashmoran/rbcoin/snapshot/current/content/pretty/lib/bitcoin/console/stream_bundle.rb
[2] 
https://patch-tag.com/r/ashmoran/rbcoin/snapshot/current/content/pretty/lib/bitcoin/console/capturing_stream_bundle.rb

-- 
http://www.patchspace.co.uk/
http://www.linkedin.com/in/ashmoran

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to