Die Instanz @user
bei Unit-Tests ist nicht die gleiche Instanz @user
am Controller, aber sie sind aus ähnlichen Gründen verwendet.
@
bedeuten Instanzvariablen, die in allen anderen Methoden des Instanzobjekts verfügbar sind.
Wenn in einem Controller Sie
def new
@user = User.new
apply_another_value_to_user
end
def apply_another_value_to_user
@user.nickname = 'Zippy'
end
haben, das funktioniert.
Wenn Sie stattdessen tun ...
def new
user = User.new
apply_another_value_to_user
end
def apply_another_value_to_user
user.nickname = 'Zippy'
end
Sie haben einen Fehler erhalten „undefiniert lokale Variable oder Methode‚user‘“, weil user
nur für die Verwendung innerhalb der new
Methode definiert ist.
Komponententests verwenden @user
, um sicherzustellen, dass ein Benutzerobjekt von verschiedenen Methoden in der Testinstanz gemeinsam genutzt werden kann. Controller verwenden @user
, um sicherzustellen, dass ein Benutzerobjekt von verschiedenen Methoden (und Ansichten) in der Controller-Instanz gemeinsam genutzt werden kann. Es kann sein, dass während eines Tests eine Controller-Instanz initialisiert wird und beide @user
Instanzvariablen erstellt werden, aber sie sind nicht die gleiche Variable.
Aus diesem Grund können Sie in einem Test zum Zugriff auf eine Controller-Instanzvariable @user
nicht direkt verwenden, sondern assigns(:user)
verwenden, der auf die Controller-Instanzvariable verweist.
expects(assigns(:user).not_to be_nil
Nehmen Sie eine Beute an [diesen Beitrag] (https://stackoverflow.com/questions/3757481/rails-local-variables-versus-instance-variables). Vielleicht kann es Ihnen helfen –