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 -

Colin

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