Thanks Pat, When I wrote my first message, I think I was missing a big part of the Mock/Stub capabilities. I thought you could only stub or mock methods of a particular instance that had been set up already in the spec. However, I realize now that you can also stub/mock class methods.
I think my approach will be to create a mock object that would give results for method calls that I expect for Net::HTTP. I would then stub the new call on Net::HTTP to return that mock object. I would then set up should_receive verifications on that object to make sure that it's being called appropriately. That way, I'm not hitting the web service, but I can verify that things are happening correctly in my method. Does this approach sound right? By the way, I have watched the Peepcode screencasts, and they have helped tremendously. I had just missed this (big) part of mocking/stubbing when I watched the Mocks video. -- Jimmy On Dec 21, 2007 11:56 AM, Pat Maddox <[EMAIL PROTECTED]> wrote: > On Dec 21, 2007 10:30 AM, jimmy zimmerman <[EMAIL PROTECTED]> > wrote: > > I'm building an http communicator class for a web service API wrapper > and > > I'm trying to go through the BDD process in doing so. I'm having a bit > of a > > struggle figuring out how to set up the tests in relation to isolating > > things appropriately as well as testing behavior vs testing > implementation. > > > > Specifically, I'm trying to set up a post method on my HttpCommunicator > so I > > have the following: > > > > describe FamilyTreeApi::HttpCommunicator, "post" do > > it "should accept an endpoint and an xml string to post" # I'm okay with > > this one > > it "should perform post content to given endpoint" > > it "should return a response object" > > end > > > > I have written/passed the tests for the first spec, but I'm having > troubles > > figuring out how to verify behavior for the second and third, and how to > > mock/stub it up. I'll be using the 'net/https' standard libraries to > > implement the POST action, and I know that it requires the use of a URI > > instance, a Net::HTTP instance, and a Net::HTTP::Post request instance. > > > > I don't want to hit the actual web service each time I run the test, so > I'd > > like to stub or mock this in some way. I think I just need some guidance > on > > how to approach something like this. > > > > Do I just ignore the implementation details? > > Do I push the actual posting of data to a private method and mock that > > method so that I can verify that it is being called? > > Would you recommend I actually hit the web service? > > > > Any help is greatly appreciated. > > -- > > Jimmy Zimmerman > > http://jimmyzimmerman.com/blog/ > > _______________________________________________ > > rspec-users mailing list > > [email protected] > > http://rubyforge.org/mailman/listinfo/rspec-users > > > > There's a PeepCode screencast where he shows how to do something like > this I think...in the past, I've always used mocks to drive an > internal API that I like. Then when that's more or less locked down, > I write a spec to implement that API. I pull response pages from the > external service, and stub Net::HTTP to return those. It's a tad bit > brittle, because if the service changes then your specs will be > invalid. However by writing the client code and driving the API > first, you can at least guarantee that you keep a clean API that you > want, that remains decoupled from the external service. > > Pat > _______________________________________________ > rspec-users mailing list > [email protected] > http://rubyforge.org/mailman/listinfo/rspec-users > -- Jimmy Zimmerman http://jimmyzimmerman.com
_______________________________________________ rspec-users mailing list [email protected] http://rubyforge.org/mailman/listinfo/rspec-users
