Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #4400 (closed defect: wontfix)

Opened 3 years ago

Last modified 2 years ago

Flash messages sometimes not showing up in functional tests

Reported by: rails@bencurtis.com Assigned to: skaes@gmx.net
Priority: normal Milestone:
Component: ActionPack Version: 1.1.0
Severity: normal Keywords:
Cc:

Description

I have a number of tests for flash messages in functional tests, and only some of them are failing, with no rhyme or reason that I've been able to determine. It can happen either as a result of a post or a get request. I can breakpoint the test right before a get, execute the get in the console, and see from the output that the flash is getting set, but then inspecting the flash gives me an empty hash.

Change History

03/24/06 17:50:54 changed by Ben Curtis <rails@bencurtis.com>

One more thing... The flash messages that missing in the tests are showing up when I run the app via script/server and hit those actions with a browser. So, again, it looks like the flash messages are being output, but are being eaten so that the flash hash is empty (but not for every test request).

03/25/06 19:45:29 changed by david

  • owner changed from David to skaes@gmx.net.

03/31/06 18:33:41 changed by Ben Curtis <rails@bencurtis.com>

  • severity changed from major to normal.

It appears the problem occurs with multiple get or post requests in the same test method. If there is only one request in a method, a test of the flash works fine, but if there is more than one, any flash tests after the second will fail.

Of course, it's best to test only one discreet piece of functionality at a time, and the new integration tests help with a series of actions, so I should probably be changing my tests to suit 1.1. So, feel free to close the ticket if this is just the way it's going to be now -- at least I now know how to get my test suite to pass again. :)

03/31/06 19:07:52 changed by Ben Curtis <rails@bencurtis.com>

Actually, one more thing... if this behavior is going to stay, I'd appreciate a workaround suggestion (like, 'invoke this method to flush the request') so I can get back to passing tests a little faster. :)

03/31/06 23:42:40 changed by iwarshak@stripey.net

Do you happen to be calling reset_session in your code?

Take a look at issue 4240.

04/01/06 01:01:16 changed by Ben Curtis <rails@bencurtis.com>

Nope

04/04/06 00:27:09 changed by anonymous

  • version changed from 1.1.0 RC1 to 1.1.0.

I've got 4700 LOC in my functional tests alone and I'd much prefer not to have to rewrite these tests. I'd really hate to have to split each request into separate requests since there's a bunch of unique setup done for each one (the setup isn't shared across tests, that's why it's grouped into a single functional test method). Repeating that setup at the top of a set of functional tests definitely isn't DRY. Anything I can do to help?

04/04/06 00:27:51 changed by tyler.kovacs@zvents.com

Last anonymous comment was from me.

04/04/06 00:59:00 changed by tyler.kovacs@zvents.com

Just discovered a workaround. Instead of refering to flashnotice?, you can access the same content in assigns(:flash)notice?. e.g.,

assert assigns(:flash)notice? =~ /there was a problem recognizing the address./

04/04/06 06:46:12 changed by skaes

I would try to fix the problem if I only knew when it occurs. Could you provide a test case that fails?

04/11/06 01:35:10 changed by erik@codefaktor.de

Following are some more details concerning this issue:

* The erroneous behaviour seems to have to do with flash vs. flash.now, see my example below - it should be easily reproducible

* I tested with get and also post, both give the same results so there's no difference so far

* I also cannot reproduce the report by Ben that more than one 'get' inside a single test method is affecting the issue at hand

* I tried to access the flash with the following, all w/o any success:

flash[:message] and flashmessage?

assigns('flash')[:message] and assigns('flash')message?

@session[:flash] and @sessionflash?

even with puts @response.inspect

* No reset_session involved, as reported in http://dev.rubyonrails.org/ticket/4240

* I'm using Rails 1.1.2 locally on OS X together with MySQL 5.0.19


Simple example, should be easy to reproduce:

*) General preparation

  rails test-www
  cd test-www
  script/generate controller Auth foo_success foo_failure

*) Edit 'config/database.yml' to ensure database connectivity for test and development databases

*) Edit 'app/controllers/auth_controller.rb':

  def foo_success
    flash[:message] = 'This is a test msg - success'
  end

  def foo_failure
    flash.now[:message] = 'This is a test msg - failure'
  end

*) Edit 'test/functional/auth_controller_test.rb':

  def test_foo_a_success
    get :foo_success
    assert_response :success
    puts "--> FLASH: #{flash.inspect}"
    assert flash.has_key?(:message)
  end

  def test_foo_b_failure
    get :foo_failure
    assert_response :success
    puts "--> FLASH: #{flash.inspect}"
    assert flash.has_key?(:message)
  end

*) Execute 'rake test:functionals':

  Loaded suite /sw/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake/rake_test_loader
  Started
  --> FLASH: {:message=>"This is a test msg - success"}
  .--> FLASH: {}
  F
  Finished in 0.104405 seconds.

    1) Failure:
  test_foo_b_failure(AuthControllerTest) [./test/functional/auth_controller_test.rb:25]:
  <false> is not true.

  2 tests, 4 assertions, 1 failures, 0 errors
  rake aborted!

*) So flash[:message] = '...' was successful whereas flash.now[:message] = was not :-(

04/19/06 05:03:03 changed by andylien@gmail.com

Hi all,

I ran into the same problem (can't test flash.now). There's a wiki page on it at http://wiki.rubyonrails.org/rails/pages/HowToTestFlash.Now/versions/2. Seems that the problem is that flash.now gets cleared when the page is rendered, so there's no way to test it except using assert_tag. That workaround is probably okay for most cases, but it'd be nice if there were some way to actually test the contents of flash.now.

In my case I was using flash.now to store error messages, some of which were being updated using RJS. This might not have a tag around it, so assert_tag doesn't work. Also RJS renders javascript, and assert_tag doesn't know how to deal it. So I would definitely welcome some way to test flash.now or some fix to this ticket.

04/19/06 05:04:35 changed by andylien@gmail.com

08/05/06 02:57:17 changed by anonymous

dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao

01/15/07 17:54:00 changed by encoded

For those of you who don't want to redo all of your tests, a possible work around is to follow the advice in bug #5386, and do the following in between get/post/etc calls:

@controller = @controller.class.send(:new) if @controller

This just simply resets the controller.

01/16/07 13:41:29 changed by ben

  • status changed from new to closed.
  • resolution set to wontfix.

Closing this ticket, as either rewriting the tests (which I did) or using the workarounds mentioned are sufficient solutions to the problem