assigns
のみコントローラ仕様のために定義され、そのは、RSpecのレールの宝石を介して行われます。 RSpecでインスタンス変数をテストする一般的なメカニズムはありませんが、Kernelのinstance_variable_get
を使用して、必要なインスタンス変数にアクセスできます。
object
は、そのインスタンス変数あなたがチェックに興味を持っていた物だったのであれば、あなたの場合には、あなたが書くことができる:UserMailer
インスタンスのネタを取得するためとして
expect(object.instance_variable_get(:@person)).to eql(user)
、私はどのような方法を見ることができませんそれをする。 method_missing
の定義をhttps://github.com/rails/rails/blob/master/actionmailer/lib/action_mailer/base.rbの中に見ると、インスタンスメソッドと同じ名前で未定義のクラスメソッドが呼び出されると、新しいメーラーインスタンスが作成されます。しかし、そのインスタンスは私が見ることができるところに保存されず、.message
という値だけが返されます。ここでは、現在githubの上で定義された関連するコードは次のとおりです。
クラスメソッド:
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
インスタンスメソッド:
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
rspec railsではメーラのインスタンス変数をテストできません。 Minitestは... – pixelearth
更新された回答を参照してください。 –
これは便利ですが、この場合を除いて、私はどのオブジェクトがそれらのインスタンス変数を設定するのかはわかりません。何か案は? – pixelearth