2017-10-12 1 views
0

Ich habe eine ziemlich einfache Controller 'ActivityLogsController' in einem 'Admin' Namespace. Wenn rails server ausgeführt wird, funktioniert alles wie erwartet und ich kann auf Routen wie /admin/activity_logs zugreifen. Wenn ich RSpec-Controller-Spezifikationen ausführe, gibt jeder Aktionstest einen Fehler zurück. Zum Beispiel:Rails app läuft gut, aber RSpec nicht mit einer Route

Failure/Error: get :index 

ActionController::UrlGenerationError: 
    No route matches {:action=>"index", :controller=>"activity_logs"} 

OK, ich gebe das ein wenig seltsam aussieht, nicht zeigte der: Reglerwert Namespace wird. Das ist offensichtlich Teil des Problems.

Die routes.rb hat den activity_logs Eintrag richtig Namensraum:

namespace :admin do 
    resources :activity_logs, except: [:show, :destroy] 
end 

Natürlich läuft rake routes gibt mir die erwarteten Namensraum Routen, was die Tatsache widerspiegelt, dass der Server ordnungsgemäß ausgeführt wird.

Der Controller ist in 'app/controllers/admin/activity_logs_controller.rb' definiert und spiegelt seinen Namensraum wider. Es ist definiert als:

class Admin::ActivityLogsController < ApplicationController 
    ... 
end 

Warum gibt die RSpec-Controller-Spezifikation die Routen nicht korrekt auflösen?

Ich poste dieses mit einer Antwort, falls andere nicht gefunden haben, was sie in anderen Fragen brauchen.

Antwort

0

Nach dem Graben für eine Weile gab mir die Frage Rspec Controllers in and out of namespace with same name einen Hinweis, obwohl in meinem Fall nicht die tatsächliche Antwort war.

Meine Probleme war, dass zusätzlich zu meinem Controller in einem Namespace hatte ich einen separaten Controller mit dem gleichen Namen in der Systemsteuerung root. Plus das Problem zu vermengen, ich hatte auch einen anderen Namensraum-Controller enthält, genannt (verwechselbar) activity_log

Also ich hatte:

controllers 
| 
|- admins 
| |- activity_logs_controller.rb 
| 
|- activity_log 
| |- other_controller.rb 
| 
|- activity_logs_controller.rb 

So scheint es, dass Rails Auto Laden arbeitete, wie ich gehofft wenn ein Server läuft. Es würde die Controller an die richtigen Stellen bringen und die entsprechenden Namespaces in den Routen erkennen.

Aber wenn es um RSpec Controller kam testet der Laden war anders, und irgendwo tief in RSpec die activity_log Unterverzeichnis und die damit verbundenen (automatisch erstellt) Modul (ActivityLog) mit OtherController, oder die Wurzel ActivityLogsController schien wird verwendet, um die Admin :: ActivityLogsController Routen und Aktionen fälschlicherweise zu generieren. Etwas in diesem Mix hat vermutlich einen admin/activity_logs_path generiert, der den erwarteten überschrieben hat.

Also, auch wenn diese schnelle Analyse des Grundes für das Problem in irgendeiner Weise ungenau ist, bestand die Lösung darin, die Wurzel activity_logs_controller.rb Datei in einen anderen Namespace zu verschieben. Zum Glück habe ich diesen Controller nur als Superklasse benutzt, von der ich andere Controller subclassiert habe, also war der Umzug einfach. Wie ich eigentlich hätte erwarten müssen, verwirrten mich mehrere Dinge, die gleich genannt wurden, und RSpec.

Verwandte Themen