Thanks Pat,<br><br>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.
<br><br>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?
<br><br>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.<br><br>--<br>Jimmy<br><br><div class="gmail_quote">
On Dec 21, 2007 11:56 AM, Pat Maddox <<a href="mailto:pergesu@gmail.com">pergesu@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div><div></div><div class="Wj3C7c">On Dec 21, 2007 10:30 AM, jimmy zimmerman <<a href="mailto:jimmy.zimmerman@gmail.com">jimmy.zimmerman@gmail.com</a>> wrote:<br>> I'm building an http communicator class for a web service API wrapper and
<br>> I'm trying to go through the BDD process in doing so. I'm having a bit of a<br>> struggle figuring out how to set up the tests in relation to isolating<br>> things appropriately as well as testing behavior vs testing implementation.
<br>><br>> Specifically, I'm trying to set up a post method on my HttpCommunicator so I<br>> have the following:<br>><br>> describe FamilyTreeApi::HttpCommunicator, "post" do<br>> it "should accept an endpoint and an xml string to post" # I'm okay with
<br>> this one<br>> it "should perform post content to given endpoint"<br>> it "should return a response object"<br>> end<br>><br>> I have written/passed the tests for the first spec, but I'm having troubles
<br>> figuring out how to verify behavior for the second and third, and how to<br>> mock/stub it up. I'll be using the 'net/https' standard libraries to<br>> implement the POST action, and I know that it requires the use of a URI
<br>> instance, a Net::HTTP instance, and a Net::HTTP::Post request instance.<br>><br>> I don't want to hit the actual web service each time I run the test, so I'd<br>> like to stub or mock this in some way. I think I just need some guidance on
<br>> how to approach something like this.<br>><br>> Do I just ignore the implementation details?<br>> Do I push the actual posting of data to a private method and mock that<br>> method so that I can verify that it is being called?
<br>> Would you recommend I actually hit the web service?<br>><br>> Any help is greatly appreciated.<br>> --<br>> Jimmy Zimmerman<br>> <a href="http://jimmyzimmerman.com/blog/" target="_blank">http://jimmyzimmerman.com/blog/
</a><br></div></div>> _______________________________________________<br>> rspec-users mailing list<br>> <a href="mailto:rspec-users@rubyforge.org">rspec-users@rubyforge.org</a><br>> <a href="http://rubyforge.org/mailman/listinfo/rspec-users" target="_blank">
http://rubyforge.org/mailman/listinfo/rspec-users</a><br>><br><br>There's a PeepCode screencast where he shows how to do something like<br>this I think...in the past, I've always used mocks to drive an<br>internal API that I like. Then when that's more or less locked down,
<br>I write a spec to implement that API. I pull response pages from the<br>external service, and stub Net::HTTP to return those. It's a tad bit<br>brittle, because if the service changes then your specs will be<br>
invalid. However by writing the client code and driving the API<br>first, you can at least guarantee that you keep a clean API that you<br>want, that remains decoupled from the external service.<br><br>Pat<br>_______________________________________________
<br>rspec-users mailing list<br><a href="mailto:rspec-users@rubyforge.org">rspec-users@rubyforge.org</a><br><a href="http://rubyforge.org/mailman/listinfo/rspec-users" target="_blank">http://rubyforge.org/mailman/listinfo/rspec-users
</a><br></blockquote></div><br><br clear="all"><br>-- <br>Jimmy Zimmerman<br><a href="http://jimmyzimmerman.com">http://jimmyzimmerman.com</a>