/ / Wie spottet man eine Rails-Unterklasse in Rspec? - Rubin-auf-Schienen

Wie spottet man eine Rails-Unterklasse in Rspec? - Ruby-on-Rails, rspec

Ich habe ein BaseController dass ich andere Controller mit überklassifizieren möchte. Ich habe auch einige Controller mit dem Standard überlegen ApplicationController.

Zum Beispiel kann ich haben:

class AController < ApplicationController
end

ebenso gut wie...

class BController < BaseController
end

Beim Testen muss ich manchmal eine beliebige "Mock" - oder "Fake" -Klasse erstellen, um before_filters, module include usw. zu testen.

Ich habe eine in meinen Spezifikationen so erstellt:

class FakeController < ApplicationController
end

Das ist gut.

Aber jetzt muss ich noch eine davon erstellen FakeController Klassen, aber diesmal als eine Unterklasse meiner BaseController Klasse.

Leider die FakeController Konstante ist bereits registriert und ich bekomme Fehler in der Klasse "Mismatch".

Ich möchte sowas nicht machen FakeController2 - Ich denke, das öffnet eine schlechte Dose Würmer.

Irgendwelche Vorschläge?

Antworten:

0 für die Antwort № 1

Ich sehe das Problem nicht mit FakeController2 oder einen anderen Namen, aber die einzige öffentliche Alternative, die mir einfällt, ist die Einführung eines Moduls, damit Ihr zweiter FakeController existiert in einem anderen Namensraum wie in:

module Foo
class FakeController < ApplicationController
end
end

Es gibt eine private Methode remove_const definiert am Kernel die verwendet werden kann, um eine Konstante eines Objekts aufzuheben. Also wenn FakeController ist definiert am Object, können Sie die Registrierung mit dem Anruf aufheben:

Object.send(:remove_const, :FakeController)

An dieser Stelle können Sie die Konstante erneut definieren, als würden Sie sie noch nie definiert haben. (Denken Sie daran: Ruby ist eine interpretierte Sprache.)


0 für die Antwort № 2

Eine Alternative zur Unterklassifizierung Ihrer Controller ist die Verwendung der anonymer Controller-Mechanismus bereitgestellt durch die rspec-schienen gem.