views:

143

answers:

3

I'm using cucumber, rails3, rspec2 and autotest. I'm trying to figure out why my features are infinitely looping. I suspect it some file being changed during the tests but I'm not sure which one. I've added some exceptions to my .autotest with no dice.

Are there any steps I can take to troubleshoot this problem?

It'd be cool if I could see what files are triggering a rerun or, at run time, what files are being watched/not watched.

here's my .autotest contents

require 'autotest/growl'

Autotest::Growl::clear_terminal = false

# Skip some paths
Autotest.add_hook :initialize do |autotest|
    %w{.git .DS_store db log tmp rerun.txt}.each { |e| autotest.add_exception(e) }
end
A: 

You can use ruby-debug . You can then add debugger statements in your code and break on them .

jmhowwala
Ok I can handle that, but once I break how can I inspect Autotest? I'm not sure where to look in order to peak into it's internals and see why it's doing what it's doing.
TheDeeno
+1  A: 

Put your files under version control. Run autotest and then run your VC system's status command (e.g. git status) to see what changed.

PS: It's probably rerun.txt, which is touched by Cucumber whenever you run features.

zetetic
using git. The status reports that nothing has changed (I'm probably ignoring the file that gets changed, _if_ there is one). I've also added rerun.txt to my autotest exceptions. Updated answer to include my .autotest content.
TheDeeno
Interesting idea though, I'll try a fresh checkout and track everything soon to see if that helps.
TheDeeno
2 files being modified (according to git) are db/test.sqlite3 and log/test.log. Seems like .autotest should be telling autotest not to watch them. I'm sure cucumber-rails has this built in as well. Does my .autotest look off?
TheDeeno
No, your `.autotest` looks right to me. Maybe it's not due to a changed file after all...One possible clue -- I have `vendor` excluded, though I can't remember why. I do recall going through the same problem as you, with autospec looping forever, and it was due to a watched file being changed, but I don't remember which one(s).
zetetic
thanks for the sanity check and direction here. I've posted how I eventually solved the problem in my answer. +1 for the help.
TheDeeno
+2  A: 

Ok, so I figured it out. I dove into autotest's source to get a better understanding of what was going on. It creates a Regexp.union out of all the exceptions and ignores files who's relative paths match the complied expression.

So, to start, to better understand the bug, I added everything in my project's directory to .autotest except ./app, ./lib, ./public, ./script, ./spec and ./features. Something like this:

# .autotest - to troubleshoot
Autotest.add_hook :initialize do |at|
  at.add_exception(%r{^\./\.git})
  ...
  at.add_exception(%r{^\./db})
  ...
  at.add_exception(%r{^\./rerun.txt})
  ...
end

When I did this, I didn't get an infinite loop. After that I just began to comment out each exception. Turns out, the only file I had to manually ignore was Gemfile.lock. For some reason this is either being changed or confusing autotest to the point where it makes cucumber loop.

Thus, this .autotest solved the problem:

# .autotest - to fix
Autotest.add_hook :initialize do |at|
  # Gemfile.lock is causing cucumber to run infinitely. Don't watch it.
  at.add_exception(%r{^\./Gemfile.lock})
end

I'm going to report on the cucumber list to let them know they should add that to the built in autotest exceptions.

TheDeeno
Thanks for sharing this.
zetetic