Rspec matchers に関するこれらのドキュメントによると、呼び出しan_instance_of
は別の呼び出し方法ですinstance_of?(Class)
。コンソールでテストすると、これは正常に機能しますが、私の仕様では失敗します。
コンソールで:
m = Mail.new
=> #<Mail::Message:70144097437100, Multipart: false, Headers: >
m.instance_of?(Mail::Message)
=> true
失敗:
1) IncomingEmailsController should deliver the email with lead info
Failure/Error: post :create, to: "me@example.com", text: "Content", html: "HTML Content", from: "email@example.com", subject: "Jimmy Bean"
<UserMailer (class)> received :forward_email with unexpected arguments
expected: (#<RSpec::Mocks::ArgumentMatchers::InstanceOf:0x007feff35fd148 @klass=Mail::Message>)
got: (#<Mail::Message:70334278571020, Multipart: true, Headers: <From: email@example.com>, <To: me@example.com>, <Subject: Jimmy Bean>, <Content-Type: multipart/alternative; boundary=--==_mimepart_50c1ffa9e2ba2_2e1e3ff7f8c35ad49574>>, nil)
incoming_emails_controller_spec.rb
describe IncomingEmailsController do
it "should deliver the email with lead info" do
# expect
UserMailer.should_receive(:forward_email).with(an_instance_of(Mail::Message))
# when
post :create, to: "me@example.com", text: "Content", html: "HTML Content", from: "email@example.com", subject: "Jimmy Bean"
end
end
incoming_emails_controller.rb
def create
# create a Mail object from the params sent by Sendgrid
prepare_email(params) #returns @email (instance of Mail::Message)
UserMailer.forward_email(@email).deliver
end
private
def prepare_email(params)
email = Mail.new
email.to = params["to"]
email.from = params["from"]
email.subject = params["subject"]
text_part = Mail::Part.new
text_part.body = params["text"]
html_part = Mail::Part.new
html_part.content_type = 'text/html; charset=UTF-8'
html_part.body = params["html"]
email.text_part = text_part
email.html_part = html_part
@email = email
end