assigns
nur für Controller Spezifikationen definiert ist, und das ist über die rspec-Schienen gem getan. Es gibt keinen allgemeinen Mechanismus zum Testen von Instanzvariablen in RSpec, aber Sie können Kernel instance_variable_get
verwenden, um auf eine beliebige Instanzvariable zuzugreifen.
Also in Ihrem Fall, wenn object
die Objektinstanz, deren variierten Sie bei der Überprüfung interessiert waren, könnten Sie schreiben:
expect(object.instance_variable_get(:@person)).to eql(user)
Was ahold der UserMailer
Instanz bekommen, kann ich sehen keine Möglichkeit, das zu tun. Wenn Sie die method_missing
Definition innerhalb von https://github.com/rails/rails/blob/master/actionmailer/lib/action_mailer/base.rb betrachten, wird eine neue Mailer-Instanz immer dann erstellt, wenn eine undefinierte Klassenmethode mit demselben Namen wie eine Instanzmethode aufgerufen wird. Aber diese Instanz wird nirgendwo gespeichert, die ich sehen kann, und nur der Wert .message
wird zurückgegeben. Hier ist der relevante Code, wie sie derzeit auf Github definiert:
Klassenmethoden:
def respond_to?(method, include_private = false) #:nodoc:
super || action_methods.include?(method.to_s)
end
def method_missing(method_name, *args) # :nodoc:
if respond_to?(method_name)
new(method_name, *args).message
else
super
end
end
Instanzmethoden:
attr_internal :message
# Instantiate a new mailer object. If +method_name+ is not +nil+, the mailer
# will be initialized according to the named method. If not, the mailer will
# remain uninitialized (useful when you only need to invoke the "receive"
# method, for instance).
def initialize(method_name=nil, *args)
super()
@_mail_was_called = false
@_message = Mail.new
process(method_name, *args) if method_name
end
def process(method_name, *args) #:nodoc:
payload = {
mailer: self.class.name,
action: method_name
}
ActiveSupport::Notifications.instrument("process.action_mailer", payload) do
lookup_context.skip_default_locale!
super
@_message = NullMail.new unless @_mail_was_called
end
end
so rspec rails können Sie nicht invairs in Mailer zu testen? Minitest macht ... – pixelearth
Siehe aktualisierte Antwort. –
Das ist nützlich, außer in diesem Fall bin ich nicht sicher, welches Objekt diese Instanzvariablen haben würde. Irgendwelche Ideen? – pixelearth