无法测试在rspec rails

时间:2017-07-20 07:19:09

标签: ruby-on-rails rspec mailer

在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

2 个答案:

答案 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的支持。 我的代码中有很多错误:

  • 第一:无需安装gem" email_spec",并更改user.rb文件

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
  • 第二:更改user_mailer_spec.rb文件

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
  • 最后:config / environments / test.rb中的配置邮件用于测试环境可以使用邮件程序(因为规范在测试环境中运行)