2012-12-07 93 views
1

根據these docs on Rspec matchers,調用an_instance_of是調用instance_of?(Class)的另一種方式。當我在控制檯中測試時,這工作正常,但在我的規範中它失敗了。an_instance_of Mail ::消息沒有返回true

在控制檯:

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: "[email protected]", text: "Content", html: "HTML Content", from: "[email protected]", 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 protected]>, <To: [email protected]>, <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: "[email protected]", text: "Content", html: "HTML Content", from: "[email protected]", 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 

回答

相關問題