2016-03-29 11 views
6

Ich schreibe Controller-Tests für eine Anwendung, die ich nicht erstellt habe, also war es definitiv ein Lernprozess. Dies ist das erste Mal, dass ich auf einen Controller stoße, der direkt von AbstractController :: Base erbt. Es verhält sich offensichtlich nicht wie andere Controller.Rspec Controller testet in Rails einen Controller, der von AbstractController :: Base erbt

Das Format ist ungefähr:

class SchwadGenericController < AbstractController::Base 
    def schwad_method var_one, var_two = nil, var_three = nil 

    if var_two.blank? 
     var_one.generic_method 
    end 

    render template: "schwad_templates/generic_template", layout: false 
    end 
end 

ich normale Tests ausprobiert, das ist, wo ich bin derzeit ANYTHING passieren zu bekommen.

require 'rails_helper' 

describe SchwadGenericController do 
    # before(:each) do 
    #  SchwadGenericController.skip_authorize_resource 
    # end 
    # login_user 
    let!(:variable){ create(:my_factory_variable) } 


    describe 'controller methods' do 

    it 'should hit this method' do 
     binding.pry 
     SchwadGenericController.schwad_method(variable) 
     # expect(response).to_render template: "schwad_templates/generic_template" 
    end 
    end 
end 

Und hier ist ungefähr wo meine Fehler landen.

Failures: 

    1) SchwadGenericController controller methods should hit this method 
     Failure/Error: Unable to find matching line from backtrace 
    NoMethodError: 
     undefined method `request=' for # <SchwadGenericController:0x007f8022db0a20> 

las ich auf abstrakte Controller und ihre Rolle in Schienen: https://www.mobomo.com/2012/06/and-you-thought-render-farms-were-just-for-pixar/

ich auf die docs hier nachlesen: http://api.rubyonrails.org/classes/AbstractController/Base.html

Ich würde wirklich zu schätzen einen anderen Satz von Augen auf diese und Führung wie Sie Controller und ihre Methoden getestet haben, mit Controllern, die von AbstractController :: Base erben. Was fehlt mir?

-Schwad

Antwort

2

Nach einigen Tests glaube ich nicht, dass dies möglich ist. Controller-Spezifikationen sind nur wrappers for Rails functional tests welche Testklassen von ActionController::Base erben. Damit Controller-Tests sogar ausgeführt werden können, muss der Controller die Objekte request und unterstützen, was bei nicht der Fall ist (dies sind defined in ActionController::Base). Deshalb erhalten Sie den bestimmten Fehler, wenn Sie den Test ausführen. Aus dem gleichen Grund können Sie die Controller-Spec-Helper nicht verwenden (erwartet) wie to_render, da sie wiederum nur für Controller-Spezifikationen definiert sind und Ihre Controller-Klasse kein "Controller" im Sinne von "Controller-Spezifikationen" ist .

Die einzige Option, die Sie zum Testen haben scheinen, ist Test der Controller wie alle anderen einfachen Rubin Klasse. Sie müssten Ihren Test aus dem Verzeichnis spec/controllers in ein anderes Verzeichnis verschieben, z. spec/abstract_controllers und dann würden Sie alle Controller spec Helfer und Test aufgeben müssen nur die Instanz-Methoden aufrufen, zB:

describe 'controller methods' do 
    it 'should hit this method' do 
    c = SchwadGenericController.new 
    expect(c).to receive(:render).with(template: "schwad_templates/generic_template", layout: false) 
    c.schwad_method(variable) 
    end 
end 
+0

Danke. Wird auf diesem Weg laufen und melden. – Schwad

1

Erweiterung direkt von AbstractController :: Base scheint die wahrscheinliche Ursache des Fehlers zu mir. Wenn Sie etwas sehr unkonventionelles tun, sollte es keinen Grund geben, dies zu tun.

Sind Sie sicher, dass Sie nicht beabsichtigen, von ActionController :: Base zu erben? Es gibt eine ganze Reihe von Modulen in ActionController, die für das Rendern benötigt werden, was wahrscheinlich den Fehler einer fehlenden Methode in Ihren Tests erklärt.

Wenn der Wechsel zu ActionController :: Base nicht funktioniert. Versuchen Sie, app.get "/path/to/action" von der Rails-Konsole auszuführen. Erhalten Sie den gleichen Fehler?

+0

Dies ist die Klasse sein kann gut funktioniert, wie beabsichtigt, auf das Schreiben von Tests in einem Fest Ich arbeite Nur Ansatz, dann kann ich den Code und Tests nach Bedarf refaktorieren. – Schwad

Verwandte Themen