在rails的邮件中,我知道所有方法都是类方法。 但我无法测试我的邮件方法:
user_mailer_spec.rb:
it "should call send_notifition method" do
@user = FactoryGirl.build(:user)
notify_email = double(:send_notifition)
expect(UsersMailer.new).to receive(:notify_email).with(@user)
@user.save
end
user_mailer.rb:
def notify(user)
mail to: user.email, subject: "Example"
end
user.rb:
after_commit :send_notifition
private
def send_notifition
UsersMailer.notify(self)
end
上述代码不会通过但是当我将通知改为self.notifition时,它会通过:
def self.notify(user)
mail to: user.email, subject: "Example"
end
答案 0 :(得分:2)
首先,我想为您指出一个用于测试电子邮件的绝佳宝石:https://github.com/email-spec/email-spec。
我认为问题在于你在UsersMailer.new
上断言,因此将模拟放在与User
模型实例化的实例不同的实例上。我通常会毫无问题地测试这样的电子邮件:
it "should call send_notifition method" do
@user = FactoryGirl.build(:user)
mail = double(:mail)
expect(UsersMailer).to receive(:notify_email).with(@user).and_return(mail)
expect(mail).to receive(:deliver_later) # or deliver_now, if you don't use a background queue
@user.save
end
请注意我是如何做expect(UsersMailer)
而不是expect(UsersMailer.new)
的,而且我并没有断言我确实已经发送了电子邮件(我认为你的电子邮件遗失了码)。
希望有所帮助。
答案 1 :(得分:1)
解决: 谢谢@Clemens Kofler的支持。 我的代码中有很多错误:
这
after_commit :send_notifition
private
def send_notifition
UsersMailer.notify(self)
end
到
after_commit :send_notifition
private
def send_notifition
UsersMailer.notify(self).deliver
end
这
it "should call send_notifition method" do
@user = FactoryGirl.build(:user)
expect(@user).to receive(:send_notifition)
notify_email = double(:send_notifition)
expect(UsersMailer.new).to receive(:notify_email).with(@user)
@user.save
end
到
it "should call send_notifition_mail_if_created_new_hospital method" do
@user = FactoryGirl.build(:user)
# I don't know why "expect(@user).to receive(:send_notifition)" not passed here
mail = double(:mail)
expect(UsersMailer).to receive(:notify_email).with(@user).and_return(mail)
allow(mail).to receive(:deliver)
@user.save
end