[mocha-developer] Need some help in reducing my repetions in tests with Mocha

Jonathan Stott jonathan.stott at gmail.com
Sat May 3 08:08:31 EDT 2008


Hi All

I'm writing a gem to interact with the todoist JSON API and I'm using mocha to mock the server responses so I don't have to have a net connection to test and so I don't need to actually use my own API key anywhere.

Mostly I am interested in verifying that a correctly formatted URL has been sent, with the appropriate parameters, e.g API key have been sent. So I end up with expectations like so:

it "includes a token in the parameters" do
  http = mock()
  http.stubs(:use_ssl=)
  http.expects(:get).with { |url| 
    url.split("?",2).last =~ /token=#{@token}/ 
  }.returns(good_response)
  Net::HTTP.stubs(:new).returns(http)
  @base.query("viewall")
end

But the problem is, all my expectations basically feature the same lines of code (from http = mock() to Net::HTTP stubs) with only the "with" block changing.  But because it is the with block changing, I'm not sure how to create a method which will insert my changing block into the middle of the expectation call.

Well, I have a prototype method:

def web_stub(good=true,&block)
  http = mock()
  http.stubs(:use_ssl=)
  get = http.expects(:get)
  if block_given?
    get = yield get
  end
  get.returns(good ? good_response : bad_response)
  Net::HTTP.stubs(:new).returns(http)
end

But this requires me to use the very ugly syntax of

web_stub do |get|
  get.with do |url| 
    url.split("?",2).first =~ /query$/
  end
end

And I'd like to avoid the need for nested blocks if possible.

Any pointers on how to implement the method, or a better way of doing it in general would be appreciated!

Regards,
Jon


More information about the mocha-developer mailing list