[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Testing classes making API calls

Alexander Murmann

4/17/2009 7:41:00 PM

I am currently working on a project which gets a lot of info from the
YouTube API and does some data mining with it.
However I would really like to have the best test coverage possible. I
thought about writing a mock up class that replaces the class making all
the YouTube API calls for tests. But I still would be able to get the
class, making the calls, covered since all my results so heavily depend
on this.

Are there any best practices for these situation?

Thank you very much for all answers!
--
Posted via http://www.ruby-....

2 Answers

Joe Gutierrez

4/17/2009 7:50:00 PM

0

Hi Alexander,

I've run into the same problem and I did exactly what you're suggesting.
You don't want to slow down your tests by making external API calls and
since I'm assuming that you already know the behavior of the YouTube
API, it makes sense to mimic that behavior in a mock class. Also, you
will get great coverage results by doing this :)

Joseph Gutierrez
Web Developer - Inc21
jgutierrez@inc21.com



Alexander Murmann wrote:
> I am currently working on a project which gets a lot of info from the
> YouTube API and does some data mining with it.
> However I would really like to have the best test coverage possible. I
> thought about writing a mock up class that replaces the class making all
> the YouTube API calls for tests. But I still would be able to get the
> class, making the calls, covered since all my results so heavily depend
> on this.
>
> Are there any best practices for these situation?
>
> Thank you very much for all answers!
>

--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.


Phlip

4/17/2009 8:07:00 PM

0

> I've run into the same problem and I did exactly what you're suggesting.
> You don't want to slow down your tests by making external API calls and
> since I'm assuming that you already know the behavior of the YouTube
> API, it makes sense to mimic that behavior in a mock class. Also, you
> will get great coverage results by doing this :)

When mocking an API, I often write a test like this:

def toast_youtuber
yt = YouTuber.new
puts yt.fetch('some_feed')
end

It's a "toast" - a temporary test that will toast your test run if you
accidentally integrate it. Switch it from "toast" to "test" in your editor,
run it, and inspect the output.

Switch it back to "toast", and copy the output into a sample file. Stash
that in your test/fixtures folder, and use it when you mock the wire
connection.

def test_youtuber_fetch
yt = YouTuber.new
yt.expects(:fetch).returns(File.read(RAILS_ROOT +
'/test/fixtures/youtuber.xml'))
yt.fetch('some_feed')
assert{ yt.feed == 'some_data' }
end

The .expects is a Mocha mock. Note we don't mock the whole object - just the
low-level part that hits the wire. (Unit tests that hit any outgoing wires
are not just slow, they are evil.)

Whenever you need to upgrade your mock data, just turn on the toast test
again and pull another real feed.

--
Phlip