[#321574] Regular Expressions — Mmcolli00 Mom <mmc_collins@...>

Hi everyone.

15 messages 2008/12/01

[#321655] Ruby cgi script — ZippySwish <fischer.jan@...>

I put "script.rb" into the cgi-bin folder of my webhost, but nothing's

12 messages 2008/12/02

[#321733] FFI 0.2.0 — "Wayne Meissner" <wmeissner@...>

Greetings Rubyists.

20 messages 2008/12/03

[#321920] Force a program to stop if runtime exceeds given duration — Aldric Giacomoni <"aldric[remove]"@...>

Any idea how to do that?

25 messages 2008/12/04
[#321924] Re: Force a program to stop if runtime exceeds given duration — "Glen Holcomb" <damnbigman@...> 2008/12/04

On Thu, Dec 4, 2008 at 10:04 AM, Aldric Giacomoni <"aldric[remove]"@

[#322011] Re: Force a program to stop if runtime exceeds given duration — Ron Fox <fox@...> 2008/12/05

See http://www.ruby-doc.org/core-1.9/classes/Process.html#M003012

[#322016] Re: Force a program to stop if runtime exceeds given duration — Aldric Giacomoni <"aldric[remove]"@...> 2008/12/05

Everybody automatically assumes that rubyists are using Linux - sadly,

[#321969] Are there any Ruby Technical Writers here? — Vito Fontaine <vito.matro@...>

I am a beginner with Ruby who was interested in writing some programs.

15 messages 2008/12/04
[#321975] Re: Are there any Ruby Technical Writers here? — Robert Klemme <shortcutter@...> 2008/12/04

On 04.12.2008 22:43, Vito Fontaine wrote:

[#321984] Re: Are there any Ruby Technical Writers here? — Vito Fontaine <vito.matro@...> 2008/12/05

Robert Klemme wrote:

[#322014] Proximity searches in Ruby — Stuart Clarke <stuart.clarke1986@...>

Does Ruby have the ability to perform proximity searches on data. For

14 messages 2008/12/05
[#322056] Re: Proximity searches in Ruby — Ilan Berci <coder68@...> 2008/12/05

No proximity searches with 1.8.. you would need a full fledged text

[#322073] shoes 2 (raisins) is go. — _why <why@...>

Salutations and hi.

13 messages 2008/12/06

[#322260] Help on algorythm — Helder Oliveira <hrpoliveira@...>

Guys i have been trying to make this algorythm but with no sucess, can

13 messages 2008/12/09
[#322261] Re: Help on algorythm — "Glen Holcomb" <damnbigman@...> 2008/12/09

On Tue, Dec 9, 2008 at 7:44 AM, Helder Oliveira <hrpoliveira@gmail.com>wrote:

[#322283] Completely new programmer lacks direction — Cameron Carroll <ubernoobs@...>

Hi. I recently picked up a beginning ruby book, having only lightly

17 messages 2008/12/09

[#322285] compare 2 text files - check for difference - Please help — Mmcolli00 Mom <mmc_collins@...>

Hi. I want to take two files that are supposed to be identical, then ook

12 messages 2008/12/09
[#322301] Re: compare 2 text files - check for difference - Please help — Brian Candler <b.candler@...> 2008/12/09

Mmcolli00 Mom wrote:

[#322306] Re: compare 2 text files - check for difference - Please help — Mmcolli00 Mom <mmc_collins@...> 2008/12/09

require 'diff/lcs/Array'

[#322417] why Hash corrupts 'key' object ? — Dmitry Perfilyev <dmitry1976@...>

Hi, I have next script:

13 messages 2008/12/10

[#322464] Q: FFI and C++? — Jeremy Henty <onepoint@...>

If I want to wrap a C++ library using FFI, can it cope with the name

14 messages 2008/12/11

[#322516] Invoking Ruby code from a low-level language? — Alex Fulton <a.fulton@...>

Hi, my sincerest apologies if this question has already been answered

11 messages 2008/12/11

[#322529] parallel method return value — Louis-Philippe <default@...>

Hi all,

17 messages 2008/12/12

[#322566] How to run background processes (more than 1 worker) parallely. — "Deepak Gole" <deepak.gole8@...>

Hi

10 messages 2008/12/12

[#322624] singleton methods vs. meta instance methods — Daniel DeLorme <dan-ml@...42.com>

If I understand the ruby object model correctly, then an object's

15 messages 2008/12/13

[#322705] ruby 1.9.1: Encoding trouble: broken US-ASCII String — Tom Link <micathom@...>

Hi,

22 messages 2008/12/14

[#322710] Help with an "easy" regular expression substitution — Iñaki Baz Castillo <ibc@...>

Hi, I'm getting crazy to get a theorically easy substitution:

16 messages 2008/12/14

[#322819] Pure Ruby Zlib::GzipWriter — Daniel Berger <djberg96@...>

Hi,

53 messages 2008/12/15
[#323877] Re: Pure Ruby Zlib::GzipWriter — Daniel Berger <djberg96@...> 2009/01/03

[#323903] Re: Pure Ruby Zlib::GzipWriter — Roger Pack <rogerpack2005@...> 2009/01/04

[#324011] Re: Pure Ruby Zlib::GzipWriter — Daniel Berger <djberg96@...> 2009/01/05

[#324442] Re: Pure Ruby Zlib::GzipWriter — Luis Lavena <luislavena@...> 2009/01/10

On Jan 9, 9:26=A0pm, "Charles L." <aquas...@gmail.com> wrote:

[#322987] Using ruby hash on array — Stuart Clarke <stuart.clarke1986@...>

I would like to process some data from an array and using hash to

14 messages 2008/12/17

[#323085] Ruby and Rails supported on 10gen — "Jim Menard" <jim.menard@...>

http://www.10gen.com/blog/2008/12/ruby-support-on-10gen

11 messages 2008/12/18

[#323166] Dreaming of a Ruby Christmas (#187) — Matthew Moss <matt@...>

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

11 messages 2008/12/19

[#323204] get first and last line from txt file - how? — Mmcolli00 Mom <mmc_collins@...>

I have txt file with date/time stamps only. I want to grab the first

19 messages 2008/12/20
[#323205] Re: get first and last line from txt file - how? — Tim Hunter <TimHunter@...> 2008/12/20

Mmcolli00 Mom wrote:

[#323207] Re: get first and last line from txt file - how? — "Yaser Sulaiman" <yaserbuntu@...> 2008/12/20

I'm just wondering..

[#323273] how to make installing Ruby easier for amateurs — Tom Cloyd <tomcloyd@...>

Greetings!

21 messages 2008/12/22

[#323312] Name that data structure! — Simon Chiang <simon.a.chiang@...>

I'm using a data structure that I'm sure has been implemented and

18 messages 2008/12/22
[#323314] Re: Name that data structure! — "Gregory Brown" <gregory.t.brown@...> 2008/12/22

On Mon, Dec 22, 2008 at 5:38 PM, Simon Chiang <simon.a.chiang@gmail.com> wrote:

[#323342] Are all Ruby built-in objects thread safe? — "Just Another Victim of the Ambient Morality" <ihatespam@...>

Are all built-in objects thread safe? For example, if I have an array

23 messages 2008/12/23
[#323346] Re: Are all Ruby built-in objects thread safe? — Yukihiro Matsumoto <matz@...> 2008/12/23

Hi,

[#323519] What does 'Monkey Patching' exactly Mean in Ruby? — "Yaser Sulaiman" <yaserbuntu@...>

According to Wikipedia, a monkey patch[1] is:

36 messages 2008/12/27
[#323813] Re: What does 'Monkey Patching' exactly Mean in Ruby? — Jg W Mittag <JoergWMittag+Usenet@...> 2009/01/02

Phlip wrote:

[#323832] Re: What does 'Monkey Patching' exactly Mean in Ruby? — "David A. Black" <dblack@...> 2009/01/02

Hi --

[#323644] Why Ruby? — Mike Stephens <rubfor@...>

I have never seen or heard of Ruby in a corporate context. The single

35 messages 2008/12/30

[#323668] Ruby 1.9.1 RC1 is released — "Yugui (Yuki Sonoda)" <yugui@...>

Hi, folks

21 messages 2008/12/30

Re: Testing Data Scrapes

From: "Michael Guterl" <mguterl@...>
Date: 2008-12-25 13:59:48 UTC
List: ruby-talk #323447
On Wed, Dec 24, 2008 at 11:55 PM, Michael Boutros <me@michaelboutros.com> wrote:
> Michael,
>
> Thanks for the link to Mocha, it looks like what I need. However, I
> still don't understand what to do to test live data. This is my project:
> http://github.com/michaelboutros/rsnipt/tree/master. How would you go at
> what I'm trying to do?
>
> Thanks,
> Michael Boutros
>
> Michael Guterl wrote:
>> On Wed, Dec 24, 2008 at 7:20 PM, Michael Boutros <me@michaelboutros.com>
>> wrote:
>>> Hello all,
>>>
>>> I'm here not for code help, but more for some opinions. At the moment
>>> I'm writing a library to interact with Snipt. However, I have no idea
>>> how to test it. I don't want to include my username and password in the
>>> tests, and I know if I create a test account and leave the credentials
>>> in some jerk will login to the account and change the password. This
>>> doesn't just apply to Snipt, but rather to any library that connects to
>>> a web service. Thoughts?
>>>
>>
>> Any time that I am testing an external service like this, I tend to
>> cache the response as a fixture and use mocks or stubs in place of the
>> actual call to the service.
>>
>> If you're using test/unit I'd use Flexmock or Mocha, RSpec has a
>> mocking/stubbing component built in.
>>

I am of the opinion that when testing external services you should not
actually be hitting that external resource during the test.  As I said
before the way I handle this is to capture the response and store it
is as a fixture and then mock/stub the appropriate method.

In your library's particular case, I would start with your Snipt#login
method.  First you may need to break your methods up into smaller
chunks in order to mock/stub the appropriate piece of the method.  I
should also mention that I've never done any of this type of testing
with Mechanize before.

Disclaimer: I'm sure someone else can point out a better way to do
this.  This is also largely untested...

The first line of your Snipt#login method:
    login_form = @agent.get('http://www.snipt.net/login').forms.first

I would break this up into two new methods:

class Snipt
  def login_page
    agent.get('http://www.snipt.net/login')
  end

  def login_form
    login_page.forms.first
  end
end

By doing this, it allows you to mock the Snipt#login_page method.

Moving along, I now think to myself, what do I need to do to make
Snipt#login_page return the type of object that I am expecting?  I
know that in this case, @agent.get is going to return a
WWW::Mechanize::Page object.  Not only that, but that it is going to
use the response from http://www.snipt.net/login in order to construct
this object.

The next step is to capture the response of http://www.snipt.net/login
in a test fixture.

require 'open-uri'
File.open('test/fixtures/login.html', 'w') do |f|
  f.write open('http://www.snipt.net/login').read
end

Now this makes the assumption that the login page is never going to
change, which is reasonable since your library is only made to work
with this particular version of the form.  If something should change
on snipt.net/login you could refresh the fixture with the same code as
above and run your tests to make sure nothing is broken.  If you're
testing against a fast moving target it may be a good idea to put the
above snippet in a Rake task so that you can easily refresh all of
your test fixtures.

Then I would look into constructing a WWW::Mechanize::Page object from
the fixture that you have saved in your test fixture directory and
setting up the mock to work properly.  To do this I would create a
WWW::Mechanize::Page object and use that as the return for your mock.

As I reached this point in writing the response I noticed another
thing that I would do in order to make testing easier.  I'd like to
reiterate that this is all just a matter of opinion, but I cannot see
any other way to do this.

I would make your constructor simply return the Snipt object and allow
another method to handle logging in.

class Snipt
  def initialize(username, password)
    @detailed_return = false

    @username, @password = username, password

    @logged_in = false
    @lexers = {}
  end

  def self.login
    snipt = Snipt.new(username, password)
    snipt.login
    snipt
  end

  def agent
    @agent ||= WWW::Mechanize.new
    @agent.user_agent_alias = 'Mac FireFox'
    @agent
  end
end

This gives you the ability to construct a Snipt object that is not
logged in for easier testing and gives you a class method for
convenience of creating a logged in Snipt object.  I also moved the
construction of the Mechanize::Agent object into it's own method for
easier testing/mocking.

require 'snipt'
require 'test/unit'
require 'flexmock/test_unit'

class TestSniptLogin < Test::Unit::TestCase
  def test_login_should_be_false_when_unsuccessful
    snipt = Snipt.new('foo', 'bar')

    login_page = WWW::Mechanize::Page.new(nil, { 'content-type' =>
'text/html' }, open('test/fixtures/login.html').read, 200)

    flexmock(snipt.agent) do |mock|
      mock.should_receive(:get).and_return(login_page)
    end

    # THIS IS INCOMPLETE
    # You will also need to mock the submission of the login_form in
your Snipt#login method.
    # You will have to create a fixture representing the failed login
form for this case.
    # For the case of a successful login, you will want to create a
fixture representing the response
    # during success.

    assert ! snipt.login
  end
end

Again, this code is largely untested, but it should give you more than
enough information to get started.  Originally I was just going to
fork your project and submit a pull request with some changes, but I
decided it would probably be better to give an explanation and some
thoughts along the way.

Happy Holidays,
Michael Guterl

In This Thread

Prev Next