Ich habe Controller:
class AccountController < ApplicationController
def index
end
private
def current_account
@current_account ||= current_user.account
end
end
Wie current_account
teste ich eine private Methode mit rspec?
PS Ich benutze Rspec2 und Ruby on Rails 3
ruby-on-rails
rspec
petRUShka
quelle
quelle
Antworten:
Verwenden Sie #instance_eval
quelle
Ich benutze die Sendemethode. Z.B:
Weil "send" private Methoden aufrufen kann
quelle
.send
?Wo wird die current_account-Methode verwendet? Welchen Zweck erfüllt es?
Im Allgemeinen testen Sie keine privaten Methoden, sondern die Methoden, die die private aufrufen.
quelle
Sie sollten nicht testen Sie Ihre private Methoden direkt, sie können und sollten durch die Ausübung des Codes von öffentlichen Methoden indirekt getestet werden.
Auf diese Weise können Sie die Interna Ihres Codes später ändern, ohne Ihre Tests ändern zu müssen.
quelle
Sie können Ihre privaten oder geschützten Methoden als öffentlich festlegen:
Fügen Sie diesen Code einfach in Ihre Testklasse ein und ersetzen Sie Ihren Klassennamen. Fügen Sie gegebenenfalls den Namespace hinzu.
quelle
quelle
Private Methoden zum Testen von Einheiten scheinen zu unzusammenhängend mit dem Verhalten der Anwendung zu sein.
Schreiben Sie zuerst Ihren Anrufcode? Dieser Code wird in Ihrem Beispiel nicht aufgerufen.
Das Verhalten ist: Sie möchten, dass ein Objekt von einem anderen Objekt geladen wird.
Warum möchten Sie den Test aus dem Kontext des Verhaltens heraus schreiben, das Sie beschreiben möchten?
Wird dieser Code an vielen Stellen verwendet? Benötigen Sie einen allgemeineren Ansatz?
https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/controller-specs/anonymous-controller
quelle
Verwenden Sie das Juwel rspec-context-private , um private Methoden vorübergehend in einem Kontext zu veröffentlichen.
Es funktioniert, indem Sie Ihrem Projekt einen gemeinsamen Kontext hinzufügen.
Wenn Sie dann
:private
als Metadaten an einendescribe
Block übergeben, sind die privaten Methoden in diesem Kontext öffentlich.quelle
Wenn Sie eine private Funktion testen müssen, erstellen Sie eine öffentliche Methode, die die private aufruft.
quelle
Ich weiß, dass dies ein bisschen hackig ist, aber es funktioniert, wenn Sie möchten, dass die Methoden von rspec getestet werden können, aber in prod nicht sichtbar sind.
Wenn Sie jetzt laufen können, sind Sie wie folgt spezifiziert:
quelle