2017-01-20 1 views
0

Je les contrôleurs suivants:Rails voir spécifications: partials référencés des contrôleurs hérités ne sont pas trouvés

ReportsController # Abstract 
ReportTemplatesController < ReportsController 
ReportDocumentsController < ReportsController 

Ainsi je les dossiers de vue suivants:

app/views/reports # Shared templates 
app/views/report_templates 
app/views/report_documents 

Par exemple, dans les deux .../report_templates/index.html.slim et .../report_documents/index.html.slim, j'ai cet appel:

== render 'reports', reports: @reports 

Le _reports.html.slim vit partiellement dans .../reports, comme il est utilisé par les deux. Cela fonctionne parfaitement.

Dans la _reports.html.slim partielle, je fais un peu troncature:

= truncate report.description, length: 100 

Je veux affirmer cela en utilisant une spécification de vue, car il est moins cher qu'une spécification de fonction.

require 'rails_helper' 

RSpec.describe "report_templates/index", type: :view do 
    it 'Truncates the description' do 
    assign :reports, [create(:report_template, description: 'This is a very long description. This is a very long description. This is a very long description. This is a very long description. This is a very long description.')] 
    render 

    expect(rendered).to have_css '.description', text: 'This is a very long description. This is a very long description. This is a very long description...' 
    end 
end 

Malheureusement, cela donne l'erreur suivante:

Failures: 

    1) reports/index Truncates the description 
    Failure/Error: render 

    ActionView::MissingTemplate: 
     Missing template reports/index with {:locale=>[:en], :formats=>[:html, :text, :js, :css, :ics, :csv, :vcf, :png, :jpeg, :gif, :bmp, :tiff, :mpeg, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :slim, :coffee, :axlsx, :jbuilder, :haml]}. Searched in: 
     * "/Users/josh/Documents/Work/Access4All/Projects/a4aa2/src/app/views" 

Mais quand je change la ligne

RSpec.describe "reports/index", type: :view do 

à, par exemple

RSpec.describe "reports_templates/index", type: :view do 

les changements d'erreur à:

Failures: 

    1) report_templates/index Truncates the description 
    Failure/Error: == render 'reports', reports: @reports 

    ActionView::Template::Error: 
     Missing partial /_reports, report_templates/_reports with {:locale=>[:en], :formats=>[:html, :text, :js, :css, :ics, :csv, :vcf, :png, :jpeg, :gif, :bmp, :tiff, :mpeg, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :slim, :coffee, :axlsx, :jbuilder, :haml]}. Searched in: 
     * "/Users/josh/Documents/Work/Access4All/Projects/a4aa2/src/app/views" 

Alors maintenant, les références partielles, qui vit dans reports, ne se trouve plus.

Donc quel que soit le chemin de vue que je fournis, la spécification ne semble pas connaître l'héritage du contrôleur et regarder dans les chemins hérités elle-même.

Comment puis-je faire fonctionner cette spécification?

Répondre

2

Je trouve un peu plus d'informations sur la question ici:

J'ai trouvé une sorte de solution temporaire au problème grâce à ces liens:

Il suffit d'ajouter le dossier hérité des chemins de consultation manuellement:

require 'rails_helper' 

RSpec.configure do |config| 
    config.before(:example, type: :view) do 
    view.lookup_context.prefixes << 'reports' 
    end 
end 

RSpec.describe "report_templates/index", type: :view do 
    # ... 

Cela se sent maladroit bien. N'y a-t-il pas un moyen de le faire automatiquement?

Je ne sais pas non plus si cela ajoute le chemin à chaque spécification de vue (ce qui ne devrait pas être le cas) ou seulement celui-ci (comme il se doit).

Mise à jour

Il semble quand j'ajouter le dossier en vue de l'appel rendu, il fonctionne sans la solution de contournement ci-dessus:

== render 'reports/reports', reports: @reports 

au lieu de seulement

== render 'reports', reports: @reports 

encore cette ne me sent pas sec.

Mise à jour

Tu ferais mieux de faire le changement de contexte de recherche pour les spécifications individuelles, sinon vous pouvez gâcher les autres spécifications de vue (comme je l'avais peur ci-dessus), que vous changez le contexte de recherche pour chaque spécification lorsque vous faites avec RSpec.configure.

ajouter ceci aux spécifications les vue spécifiques:

before do 
    view.lookup_context.prefixes << 'reports' 
end