Lighthouse has a new layout. Prefer the old one? Return to the old layout, and switch back any time from the link at the top of each page.

This project is archived and is in readonly mode.

Tests which use assert_select fail in 2.3.0 RC1 when upgrading an app

#1890

If I have an assert_select in my test like assert_select "input#system_article_name[type='text']", I get the following stacktrace as an error when running the tests. This occurs both with autotest & with rake test

NameError: uninitialized constant HTML::Document

activesupport (2.3.0) lib/active_support/dependencies.rb:440:in `load_missing_constant'
activesupport (2.3.0) lib/active_support/dependencies.rb:80:in `const_missing'
actionpack (2.3.0) lib/action_controller/test_process.rb:484:in `html_document'
actionpack (2.3.0) lib/action_controller/assertions/selector_assertions.rb:614:in `response_from_page_or_rjs'
actionpack (2.3.0) lib/action_controller/assertions/selector_assertions.rb:213:in `assert_select'
/test/functional/system_articles_controller_test.rb:20:in `test_get_new'
activesupport (2.3.0) lib/active_support/testing/setup_and_teardown.rb:57:in `__send__'
activesupport (2.3.0) lib/active_support/testing/setup_and_teardown.rb:57:in `run'

Reported by Niels Meersschaert · February 5th, 2009 @ 10:37 PM

State: wontfix
Milestone: none
Assigned to: josh josh
Importance: none

Activity

  1. DHH
    DHH
    • Assigned user set to josh
    • Milestone cleared.

    February 6th, 2009 @ 01:41 PM

  2. josh
    josh
    • State changed from new to wontfix

    Make sure you are using ActionController::TestCase or ActionController::IntegrationTest.

    I thought this would be an autoload issue, but I tried with a fresh scaffold and assert_select works fine.

    February 7th, 2009 @ 05:30 AM

  3. Niels Meersschaert
    Niels Meersschaert
    • Title changed from Tests which use assert_select fail in 2.3.0 RC1 to Tests which use assert_select fail in 2.3.0 RC1 when upgrading an app

    The test in question, like all the rest in my project inherit from ActionController::TestCase. class SystemArticlesControllerTest < ActionController::TestCase. The stacktrace provided was just one. Every controller test in my app which uses assert_select fails with that error. This app did start out as a 1.x Rails app, so it has been upgraded over time. Is there something outside of the ActionController::TestCase which could explain the load order issue this exposes?

    February 9th, 2009 @ 03:10 PM

  4. josh
    josh

    I doubled checked and it looks like HTML "should" be autoloading correctly. I'm really surprised that this happens with "rake", it would more commonly happen if you ran you test standalone.

    Can you try adding "require 'html/document'" to the top of your tests (this is not the correct solution). I'm just hoping that fixes it and we can confirm its an autoloading issue.

    February 9th, 2009 @ 03:15 PM

  5. Niels Meersschaert
    Niels Meersschaert

    I think this is getting us closer.... now I get:

    /Library/Ruby/Site/1.8/rubygems/custom_require.rb:31:in gem_original_require': no such file to load -- html/document (MissingSourceFile)

    from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:31:in `require'
    from /Library/Ruby/Gems/1.8/gems/activesupport-2.3.0/lib/active_support/dependencies.rb:158:in `require'
    from ./test/functional/system_articles_controller_test.rb:2
    from /Library/Ruby/Gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb:5:in `load'
    from /Library/Ruby/Gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb:5
    from /Library/Ruby/Gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb:5:in `each'
    from /Library/Ruby/Gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb:5
    
    

    This happens when I place the require just below the test_helper require as well as if I place it inside the class block.

    So perhaps the autoload can't locate the class properly based on the html/document reference?

    February 9th, 2009 @ 03:32 PM

  6. Niels Meersschaert
    Niels Meersschaert

    I found another symptom which might be causing this. The first controller failure resulted in this stacktrace:

    test_changelog_do_not_exist(Admin::AboutControllerTest): NoMethodError: undefined method id2name' for {:instance_writer=>false}:Hash

    money (1.7.1) lib/support/cattr_accessor.rb:7:in `cattr_reader'
    money (1.7.1) lib/support/cattr_accessor.rb:5:in `each'
    money (1.7.1) lib/support/cattr_accessor.rb:5:in `cattr_reader'
    money (1.7.1) lib/support/cattr_accessor.rb:54:in `cattr_accessor'
    actionpack (2.3.0) lib/action_controller/vendor/html-scanner/html/sanitizer.rb:44
    activesupport (2.3.0) lib/active_support/dependencies.rb:158:in `require'
    actionpack (2.3.0) lib/action_controller/vendor/html-scanner/html/document.rb:4
    actionpack (2.3.0) lib/action_controller/test_process.rb:484:in `html_document'
    actionpack (2.3.0) lib/action_controller/assertions/selector_assertions.rb:614:in `response_from_page_or_rjs'
    actionpack (2.3.0) lib/action_controller/assertions/selector_assertions.rb:213:in `assert_select'
    /test/functional/admin/about_controller_test.rb:49:in `test_changelog_do_not_exist'
    activesupport (2.3.0) lib/active_support/testing/setup_and_teardown.rb:57:in `__send__'
    activesupport (2.3.0) lib/active_support/testing/setup_and_teardown.rb:57:in `run'
    
    

    Every controller after that failed with NameError: uninitialized constant HTML::Document

    February 9th, 2009 @ 05:39 PM

  7. josh
    josh
    • State changed from wontfix to open

    Weirdness.

    Could you try creating a minimal rails app with this failure. It could be some quirkiness with your Rails app.

    February 9th, 2009 @ 06:11 PM

  8. Niels Meersschaert
    Niels Meersschaert

    It appears that the Money gem may be overstepping some rails calls thus causing this issue.

    February 9th, 2009 @ 06:17 PM

  9. Niels Meersschaert
    Niels Meersschaert

    I believe it was caused because my app uses ActiveMerchant as a plugin. As a result, I had a config.gem "money" requirement. When I removed that requirement, the cattr_accessor errors went away, as well as the HTML::Document issues. I believe it was a collision between the 2, as I couldn't replicate it in a fresh app.

    My apologies that this isn't purely a Rails issue. This does point to a potential conflict that only appears to have been introduced in 2.3.0, but as to whether that is a Money gem/Active Merchant issue or a Rails issue, I'll leave as an open question.

    February 9th, 2009 @ 06:53 PM

  10. josh
    josh
    • State changed from open to wontfix

    You may want to try with the edge release of ActiveMerchant to see if the problem exists there.

    If it turns out to be something funky with our code, I'd be happy to apply a patch. I'd hate to see ActiveMerchant have to hack around a Rails issue.

    February 9th, 2009 @ 08:13 PM

  11. rob
    rob

    Had the same issue, updating the Money gem to 2.0.0 fixed it.

    February 9th, 2009 @ 11:01 PM

  12. Niels Meersschaert
    Niels Meersschaert

    Also using ActiveMerchant as a gem v1.4.1 eliminates the issue. It looks like the conflict is only between older versions of ActiveMerchant/Money & Rails 2.3.0. Updating both eliminates the conflict.

    February 11th, 2009 @ 05:12 PM