Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

View specs fail when view renders partial #137

Closed
nerdinand opened this issue Oct 15, 2017 · 7 comments · Fixed by hanami/hanami#860
Closed

View specs fail when view renders partial #137

nerdinand opened this issue Oct 15, 2017 · 7 comments · Fixed by hanami/hanami#860
Assignees
Labels

Comments

@nerdinand
Copy link

nerdinand commented Oct 15, 2017

It seems view specs fail when the tested view renders a partial, e.g.

<% # apps/web/templates/books/edit.html.erb %>

Edit

<%= render partial: 'common/errors' %>
<% # apps/web/templates/common/_errors.html.erb %>

Errors!
# spec/web/views/books/edit_spec.rb
require 'spec_helper'
require_relative '../../../../apps/web/views/books/edit'

describe Web::Views::Books::Edit do
  let(:exposures) { Hash[foo: 'bar'] }
  let(:template)  { Hanami::View::Template.new('apps/web/templates/books/edit.html.erb') }
  let(:view)      { Web::Views::Books::Edit.new(template, exposures) }
  let(:rendered)  { view.render }

  it 'includes the errors partial' do
    expect(rendered).to include('Errors!')
  end
end

When running the app and visiting http://localhost:2300/books/1/edit, everything works as expected:

Edit Errors!

But when running the specs:

$ be rspec
.F

Failures:

  1) Web::Views::Books::Edit includes the errors partial
     Failure/Error: let(:rendered)  { view.render }
     
     NoMethodError:
       undefined method `to_sym' for nil:NilClass
     # apps/web/templates/books/edit.html.erb:3:in `block in singleton class'
     # apps/web/templates/books/edit.html.erb:-6:in `instance_eval'
     # apps/web/templates/books/edit.html.erb:-6:in `singleton class'
     # apps/web/templates/books/edit.html.erb:-9:in `__tilt_70145041233860'
     # ./spec/web/views/books/edit_spec.rb:8:in `block (2 levels) in <top (required)>'
     # ./spec/web/views/books/edit_spec.rb:11:in `block (2 levels) in <top (required)>'

Finished in 0.00334 seconds (files took 1.05 seconds to load)
2 examples, 1 failure

Failed examples:

rspec ./spec/web/views/books/edit_spec.rb:10 # Web::Views::Books::Edit includes the errors partial

Here's a sample application to reproduce this: bookshelf.zip

BTW, it's totally possible that I'm just holding it wrong. But this seems quite odd...

@AlfonsoUceda
Copy link

Hi @nerdinand thank you for this issue, we'll take a look as soon as possible.

@nerdinand
Copy link
Author

be rspec --backtrace leads to this:

.F

Failures:

  1) Web::Views::Books::Edit includes the errors partial
     Failure/Error: let(:rendered)  { view.render }
     
     NoMethodError:
       undefined method `to_sym' for nil:NilClass
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/hanami-view-1.0.0/lib/hanami/view/configuration.rb:445:in `find_partial'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/hanami-view-1.0.0/lib/hanami/view/rendering/partial_finder.rb:39:in `find'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/hanami-view-1.0.0/lib/hanami/view/rendering/partial.rb:26:in `template'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/hanami-view-1.0.0/lib/hanami/view/rendering/template.rb:44:in `render'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/hanami-view-1.0.0/lib/hanami/view/rendering/layout_scope.rb:90:in `render'
     # apps/web/templates/books/edit.html.erb:3:in `block in singleton class'
     # apps/web/templates/books/edit.html.erb:-6:in `instance_eval'
     # apps/web/templates/books/edit.html.erb:-6:in `singleton class'
     # apps/web/templates/books/edit.html.erb:-9:in `__tilt_70145607464900'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/tilt-2.0.8/lib/tilt/template.rb:170:in `call'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/tilt-2.0.8/lib/tilt/template.rb:170:in `evaluate'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/tilt-2.0.8/lib/tilt/template.rb:109:in `render'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/hanami-view-1.0.0/lib/hanami/view/template.rb:41:in `render'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/hanami-view-1.0.0/lib/hanami/view/rendering.rb:139:in `rendered'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/hanami-view-1.0.0/lib/hanami/view/rendering.rb:153:in `layout'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/hanami-view-1.0.0/lib/hanami/view/rendering.rb:107:in `render'
     # ./spec/web/views/books/edit_spec.rb:8:in `block (2 levels) in <top (required)>'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/memoized_helpers.rb:298:in `block (2 levels) in let'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/memoized_helpers.rb:157:in `block (3 levels) in fetch_or_store'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/memoized_helpers.rb:157:in `fetch'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/memoized_helpers.rb:157:in `block (2 levels) in fetch_or_store'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-support-3.6.0/lib/rspec/support/reentrant_mutex.rb:23:in `synchronize'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/memoized_helpers.rb:156:in `block in fetch_or_store'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/memoized_helpers.rb:155:in `fetch'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/memoized_helpers.rb:155:in `fetch_or_store'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/memoized_helpers.rb:298:in `block in let'
     # ./spec/web/views/books/edit_spec.rb:11:in `block (2 levels) in <top (required)>'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:254:in `instance_exec'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:254:in `block in run'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:500:in `block in with_around_and_singleton_context_hooks'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:457:in `block in with_around_example_hooks'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/hooks.rb:464:in `block in run'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/hooks.rb:602:in `run_around_example_hooks_for'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/hooks.rb:464:in `run'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:457:in `with_around_example_hooks'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:500:in `with_around_and_singleton_context_hooks'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:251:in `run'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/example_group.rb:627:in `block in run_examples'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/example_group.rb:623:in `map'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/example_group.rb:623:in `run_examples'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/example_group.rb:589:in `run'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:118:in `block (3 levels) in run_specs'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:118:in `map'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:118:in `block (2 levels) in run_specs'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/configuration.rb:1894:in `with_suite_hooks'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:113:in `block in run_specs'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/reporter.rb:79:in `report'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:112:in `run_specs'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:87:in `run'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:71:in `run'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:45:in `invoke'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/exe/rspec:4:in `<top (required)>'
     # /Users/ferdi/.rbenv/versions/2.4.1/bin/rspec:22:in `load'
     # /Users/ferdi/.rbenv/versions/2.4.1/bin/rspec:22:in `<top (required)>'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/cli/exec.rb:74:in `load'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/cli/exec.rb:74:in `kernel_load'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/cli/exec.rb:27:in `run'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/cli.rb:365:in `exec'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/vendor/thor/lib/thor.rb:369:in `dispatch'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/cli.rb:22:in `dispatch'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/vendor/thor/lib/thor/base.rb:444:in `start'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/cli.rb:13:in `start'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/exe/bundle:30:in `block in <top (required)>'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/friendly_errors.rb:121:in `with_friendly_errors'
     # /Users/ferdi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/exe/bundle:22:in `<top (required)>'
     # /Users/ferdi/.rbenv/versions/2.4.1/bin/bundle:22:in `load'
     # /Users/ferdi/.rbenv/versions/2.4.1/bin/bundle:22:in `<main>'

Finished in 0.00504 seconds (files took 1.33 seconds to load)
2 examples, 1 failure

Failed examples:

rspec ./spec/web/views/books/edit_spec.rb:10 # Web::Views::Books::Edit includes the errors partial

@nerdinand
Copy link
Author

nerdinand commented Oct 21, 2017

I did some digging. For some reason the resolution of the format attribute does not work properly for partials in this case.

Changing

PartialFinder.new(@view.class, @options).find

to

PartialFinder.new(@view.class, @options.merge(format: :html)).find

fixes the problem. I don't know what a proper fix would look like though...

@nerdinand
Copy link
Author

@AlfonsoUceda @jodosha Any news on this one? Would really like to set my view tests to non-pending... ;-)

@jodosha jodosha self-assigned this Nov 7, 2017
@jodosha
Copy link
Member

jodosha commented Nov 7, 2017

@nerdinand Can you please try with hanami-view v1.1.0, but with this line in your unit test?

let(:exposures) { Hash[foo: 'bar', format: :html] }

This works for me locally.

@nerdinand
Copy link
Author

@jodosha that worked for me, thanks. Even with hanami-view 1.0.1. But you have to admit it's not a very obvious thing ;).

@jodosha
Copy link
Member

jodosha commented Nov 8, 2017

@nerdinand no it's not obvious, that's why we're adding it by default (see hanami/hanami#860)

Thanks for getting back so quickly.

timriley pushed a commit that referenced this issue Mar 15, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants