2016-03-29 30 views
6

Piszę testy kontrolerów dla aplikacji, których nie zbudowałem, więc zdecydowanie był to proces uczenia się. Po raz pierwszy spotykam się z kontrolerem, który dziedziczy bezpośrednio z AbstractController :: Base. Nie zachowuje się oczywiście tak samo jak inni kontrolerzy.Rspec Testowanie kontrolera w Railsach kontrolera dziedziczącego z AbstractController :: Base

Jego format jest w przybliżeniu:

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 

Próbowałem normalne testy, to gdzie jestem obecnie dostać COKOLWIEK wydarzy.

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 

I tutaj jest mniej więcej, gdzie lądują moje awarie.

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> 

czytałem się na abstrakcyjnych kontrolerów i ich rola w szynach tutaj: https://www.mobomo.com/2012/06/and-you-thought-render-farms-were-just-for-pixar/

ja przeczytać na docs tutaj: http://api.rubyonrails.org/classes/AbstractController/Base.html

będę naprawdę wdzięczny inny zestaw oczy na to i wskazówek o tym, jak testowaliście kontrolery i ich metody, z kontrolerami, które dziedziczą z AbstractController :: Base .... Czego mi brakuje?

-Schwad

Odpowiedz

2

Po kilku próbach nie sądzę, aby było to możliwe. Specyfikacje kontrolera to tylko wrappers for Rails functional tests, które testują klasy dziedziczące po ActionController::Base. Aby testy kontrolerów mogły działać, kontroler musi obsługiwać obiekty request i response, co nie jest zgodne z AbstractController::Base (są to defined w ActionController::Base). Właśnie dlatego pojawia się szczególny błąd podczas uruchamiania testu. Z tego samego powodu nie będziesz w stanie używać pomocników specyfikacji kontrolera (spodziewa się), takich jak to_render, ponieważ są one zdefiniowane tylko dla specyfikacji kontrolera, a klasa kontrolera nie jest "kontrolerem" w rozumieniu "kontroler specs" .

Jedyną dostępną opcją testowania jest przetestowanie sterownika tak samo, jak każdej innej zwykłej klasy ruby ​​. Musisz przenieść test z katalogu spec/controllers do innego, np. spec/abstract_controllers i wtedy trzeba by zrezygnować ze wszystkich pomocników i kontroler spec testu tylko Wywołanie metody instancji, np:

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

Dziękuję. Będzie działać w ten sposób i zgłoś się. – Schwad

1

Rozszerzanie bezpośrednio od AbstractController :: Base wydaje się prawdopodobnym źródłem błędu do mnie. Chyba, że ​​robisz coś bardzo niekonwencjonalnego, nie ma powodu, aby to robić.

Czy na pewno nie zamierzasz dziedziczyć po ActionController :: Base? W programie ActionController wymagana jest duża liczba modułów wymaganych do renderowania, co prawdopodobnie tłumaczy błąd w brakującej metodzie testów.

Jeśli przejście na ActionController :: Base nie działa. Spróbuj uruchomić app.get "/path/to/action" z konsoli szyn. Czy otrzymujesz ten sam błąd?

+0

Może to być klasa działa zgodnie z przeznaczeniem, ja pracuję na testach w pisaniu odczytu - tylko podejście, w razie potrzeby mogę zrestrukturyzować kod i testy. – Schwad