What can prevent an integration test from loading instance variables?

On 10 February 2017 at 09:16, 'krfg' via Ruby on Rails: Talk

Only the test, the application works as expected.
I thought the problem might be that there are too many nested partials in the homepage, but apart from that I have no idea why the test fails

On 10 February 2017 at 10:23, 'krfg' via Ruby on Rails: Talk

Only the test, the application works as expected.
I thought the problem might be that there are too many nested partials in
the homepage, but apart from that I have no idea why the test fails

Please remember to quote the previous message when replying, so that
it is more easy to follow the thread.

Exactly what do you mean when you say the test is failing? Is the test
itself failing or are you getting errors shown in the console when you
run the test? In either case copy/paste the error here so we can get a
better idea of what is going wrong. If you are not already doing so
then just run the one test.

Colin

You can have a look at the partial _social_layer.html.erb at this link: it is the code included in the if statement.
As I said, I changed my homepage as follows:

<% if logged_in? %>
<% if current_user.gamer? %>
<%= render ‘static_pages/gamers_home’ %>
<% else %>
<%= render ‘static_pages/non_gamers_home’ %>
<% end %>
<% else %>
<%= render ‘static_pages/non_logged_in_home’ %>
<% end %>

I reported an extract of static_pages/gamers_home in my first post.
In theory all instance variables inside static_pages_controller.rb should be loaded by the test but they are not.

On 10 February 2017 at 10:34, 'krfg' via Ruby on Rails: Talk

Below is what the console is reporting when I run the test.
As you can notice, the test raises one error: method any? on nil class (the instance variable @atp_tournaments of the code in my first post).
If I change this instance variable with its explicit value, the next error is of next method on next variable and so on.

me@SATELLITE-L50-A-161:~/workspace/fantasytennis_app (tabbed-navigation)*$ rails test test/integration/microposts_interface_test.rb
Running via Spring preloader in process 7112
Started with run options --seed 4407

ERROR[“test_micropost_interface”, MicropostsInterfaceTest, 6.374447322000378]
test_micropost_interface#MicropostsInterfaceTest (6.37s)
ActionView::Template::Error: ActionView::Template::Error: undefined method any?' for nil:NilClass app/views/static_pages/_gamers_home.html.erb:44:in _app_views_static_pages__gamers_home_html_erb___4018195177444297552_78940320’
app/views/static_pages/home.html.erb:3:in _app_views_static_pages_home_html_erb___222411343280921082_78889880' app/controllers/microposts_controller.rb:12:in create’
test/integration/microposts_interface_test.rb:16:in block (2 levels) in <class:MicropostsInterfaceTest>' test/integration/microposts_interface_test.rb:15:in block in class:MicropostsInterfaceTest

2/2: [==========================================================================] 100% Time: 00:00:06, Time: 00:00:06

Finished in 6.63174s
2 tests, 8 assertions, 0 failures, 1 errors, 0 skips

In app/controllers/static_pages_
controller.rb the following variables (among others) are defined:

def home
if logged_in? && !current_user.gamer?

elsif logged_in? && current_user.gamer?

@week_num = Time.now.strftime("%W").to_i
@atp_tournaments = AtpCalendar.where(“week @> ?”, “{#{@week_num}}”)
@wta_tournaments = WtaCalendar.where(“week @> ?”, “{#{@week_num}}”)
end
end

The AtpCalendar and WtaCalendar fixtures are empty.
Therefore, any? should return an empty array

On 10 February 2017 at 11:02, 'krfg' via Ruby on Rails: Talk

In app/controllers/static_pages_controller.rb the following variables (among
others) are defined:

  def home
        if logged_in? && !current_user.gamer?
            ...
    elsif logged_in? && current_user.gamer?
            ...
            @week_num = Time.now.strftime("%W").to_i
            @atp_tournaments = AtpCalendar.where("week @> ?",
"{#{@week_num}}")

Did you understand my previous post when I suggested that you should
quote the previous message when replying?

Put some debug code to check that it is getting to the line above. You
can use logger.info and the result will be printed in the log. So
something like
logger.info("atp tournaments count = #{@atp_tournaments.count}"

Colin

Ok, I will quote.
I would need information about logger.info
When I try to open test.log Atom warns me that if it opens large files it might become unresponsive.
Shall I take for granted that you are interested it test.log?

My application test.log file is 107 MB

On 10 February 2017 at 11:50, 'krfg' via Ruby on Rails: Talk

I would need information about logger.info
When I try to open test.log Atom warns me that if it opens large files it
might become unresponsive.
Shall I take for granted that you are interested it test.log?

Whichever log is relevant at the time, so when running tests then yes
it is test.log. You can use tail to watch the log while you run the
test
tail -f log/test.log
or you can use tail after the event just to show the last lines
tail -n 100 log/test.log

Also you can delete or empty the log file before running the test,
then it will only contain the latest information.

In fact I think logger.info outputs to the console too so you don't
need to look at the log. Not certain about that though.

Colin

Ok, thanks for the suggestion.
I will try to use tail if it works with such a heavy file, otherwise I would need instructions on how to empty the file.
The most important thing I have to understand is: where should I place logger.info?
In static_pages_controller.rb before the declaration of @atp_tournaments variable?

On 10 February 2017 at 12:16, 'krfg' via Ruby on Rails: Talk

On 10 February 2017 at 12:16, 'krfg' via Ruby on Rails: Talk

As you suggested I inserted logger.info immediately after the declaration of @atp_tournaments in static_pages_controller.rb:

def home
if logged_in? && !current_user.gamer?

elsif logged_in? && current_user.gamer?

@week_num = Time.now.strftime("%W").to_i
@atp_tournaments = AtpCalendar.where(“week @> ?”, “{#{@week_num}}”)
logger.info(“atp tournaments count = #{@atp_tournaments.count}”)
@wta_tournaments = WtaCalendar.where(“week @> ?”, “{#{@week_num}}”)
end
end

Using tail -n 100 log/test.log I got the following outut:

atp tournaments count = 0

On 10 February 2017 at 12:44, 'krfg' via Ruby on Rails: Talk

...
As you suggested I inserted logger.info immediately after the declaration of
@atp_tournaments in static_pages_controller.rb:

  def home
      if logged_in? && !current_user.gamer?
            ...
      elsif logged_in? && current_user.gamer?
            ...
          @week_num = Time.now.strftime("%W").to_i
          @atp_tournaments = AtpCalendar.where("week @> ?",
"{#{@week_num}}")
          logger.info("atp tournaments count = #{@atp_tournaments.count}")
          @wta_tournaments = WtaCalendar.where("week @> ?",
"{#{@week_num}}")
      end
  end

Using tail -n 100 log/test.log I got the following outut:

atp tournaments count = 0

Good, so now we can be confident that it is getting to that line. One
thing that confuses me is that in an earlier post you showed the
error:

ERROR["test_micropost_interface", MicropostsInterfaceTest, 6.374447322000378]
test_micropost_interface#MicropostsInterfaceTest (6.37s)
ActionView::Template::Error: ActionView::Template::Error:
undefined method `any?' for nil:NilClass
            app/views/static_pages/_gamers_home.html.erb:44:in
`_app_views_static_pages__gamers_home_html_erb___4018195177444297552_78940320'
            app/views/static_pages/home.html.erb:3:in
`_app_views_static_pages_home_html_erb___222411343280921082_78889880'
            app/controllers/microposts_controller.rb:12:in `create'
            test/integration/microposts_interface_test.rb:16:in `block
(2 levels) in <class:MicropostsInterfaceTest>'
            test/integration/microposts_interface_test.rb:15:in `block
in <class:MicropostsInterfaceTest>'

which suggests that you are in the create method of the microposts
controller. What I don't understand is how it then getting to the
static pages controller. Can you post the start of
microposts_controller.rb (up to at least line 12) and also the start
of static_pages/home.html.erb.

Colin

The home page is controlled by static_pages_controller.rb
However the part of the home page concerning microposts creation and deletion is controlled by the microposts controller.
Below is an extract of microposts_controller.rb

class MicropostsController < ApplicationController
before_action :logged_in_user, only: [:create, :destroy]
before_action :correct_user, only: :destroy

def create
@micropost = current_user.microposts.build(micropost_params)
if @micropost.save
flash[:success] = “Micropost created!”
redirect_to root_url
else
@feed_items = []
render ‘static_pages/home’
end
end

Line 12 is exactly render ‘static_pages/home’
app/view/static_pages/home.html.erb is all below:

<% if logged_in? %>
<% if current_user.gamer? %>
<%= render ‘static_pages/gamers_home’ %>
<% else %>
<%= render ‘static_pages/non_gamers_home’ %>
<% end %>
<% else %>
<%= render ‘static_pages/non_logged_in_home’ %>
<% end %>

The home page is controlled by static_pages_controller.rb
However the part of the home page concerning microposts creation and deletion is controlled by the microposts controller.
Below is an extract of microposts_controller.rb

class MicropostsController < ApplicationController
before_action :logged_in_user, only: [:create, :destroy]
before_action :correct_user, only: :destroy

def create
@micropost = current_user.microposts.build(micropost_params)
if @micropost.save
flash[:success] = “Micropost created!”
redirect_to root_url
else
@feed_items = []
render ‘static_pages/home’
end
end

Line 12 is exactly render ‘static_pages/home’
app/view/static_pages/home.html.erb is all below:

<% if logged_in? %>
<% if current_user.gamer? %>
<%= render ‘static_pages/gamers_home’ %>
<% else %>
<%= render ‘static_pages/non_gamers_home’ %>
<% end %>
<% else %>
<%= render ‘static_pages/non_logged_in_home’ %>
<% end %>

The lines of the test that are mentioned by the test itself (lines 15 and 16) are:

assert_no_difference 'Micropost.count' do
  post microposts_path, params: { micropost: { content: "" } }
end

On 10 February 2017 at 13:46, 'krfg' via Ruby on Rails: Talk

...
The home page is controlled by static_pages_controller.rb
However the part of the home page concerning microposts creation and
deletion is controlled by the microposts controller.
Below is an extract of microposts_controller.rb

class MicropostsController < ApplicationController
  before_action :logged_in_user, only: [:create, :destroy]
  before_action :correct_user, only: :destroy

  def create
    @micropost = current_user.microposts.build(micropost_params)
    if @micropost.save
      flash[:success] = "Micropost created!"
      redirect_to root_url
    else
      @feed_items = []
      render 'static_pages/home'

The render line does not invoke the static_pages controller, it just
invokes the view files for static_pages/home, so it will not call the
static_pages controller to setup your variables. I don't know how your
debug got to that code, I suspect it was from a different part of the
test. Perhaps you meant redirect_to which will invoke the controller
to perform the action. You may find this useful -
http://tosbourn.com/difference-between-redirect-render-rails/

Colin

On Fri, Feb 10, 2017 at 3:02 AM, 'krfg' via Ruby on Rails: Talk