assigns
只爲控制器規格定義而這通過RSpec的護欄寶石完成。沒有通用的機制來測試RSpec中的實例變量,但是您可以使用Kernel的instance_variable_get
來訪問任何您想要的實例變量。
你的情況
所以,如果object
是其實例變量,你有興趣在檢查對象,你可以寫:
expect(object.instance_variable_get(:@person)).to eql(user)
至於得到阿霍德的UserMailer
實例,我看不到任何方式要做到這一點。查看https://github.com/rails/rails/blob/master/actionmailer/lib/action_mailer/base.rb中的method_missing
定義,只要使用與實例方法相同的名稱調用未定義的類方法,就會創建一個新的郵件實例。但是這個實例並沒有保存在我能看到的任何地方,只返回了.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
so rspec rails不允許你在郵件程序中測試實例變量? Minitest確實... – pixelearth
查看更新的答案。 –
這很有用,除了在這種情況下,我不確定哪些對象會設置這些實例變量。有任何想法嗎? – pixelearth