使用Rspec / Factory Girl / Rails测试注册确认

时间:2017-09-12 00:19:25

标签: ruby-on-rails testing rspec devise factory-bot

尝试创建一个Rspec / Factory女孩测试,以确保在注册时确认Devise的确认 - 该网站有3种语言(日语,英语,中文),所以我想确保没有什么能破坏注册过程

我有以下工厂: user.rb<<拥有一般用户邮件测试所需的一切 signup.rb有:

FactoryGirl.define do
  factory :signup do
    token "fwoefurklj102939"
    email "abcd@ek12o9d.com"
  end
end

我想测试的devise user_mailer方法是:

def confirmation_instructions(user, token, opts={})
  @user = user
  set_language_user_only
  mail to: @user.email,
       charset: (@user.language == User::LANGUAGE_JA ? 'ISO-2022-JP' : 'UTF8')
end

我不能为我的生活弄清楚如何让token部分参与测试 - 任何建议或想法?

我一直在尝试这些方面(检查电子邮件正在发送)但没有成功:

describe UserMailer, type: :mailer do

  describe "sending an email" do
    after(:all) { ActionMailer::Base.deliveries.clear }

    context "Japanese user emails" do
      subject(:signup) { create(:signup) }
      subject(:user) { create(:user) }

      subject(:mail) do
        UserMailer.confirmation_instructions(user, token, opts={})
      end

      it "sends an email successfully" do
        expect { mail.deliver }.to change { ActionMailer::Base.deliveries.size }.by(1)
      end
    end
  end
end

产生的错误是undefined local variable or method令牌' and I cannot work out why it is not coming from the注册`工厂。我试过改变

subject(:mail) do
  UserMailer.confirmation_instructions(user, token, opts={})
end

subject(:mail) do
  UserMailer.confirmation_instructions(user, signup.token, opts={})
end

但后来我收到了这个错误:

Failure/Error: subject(:signup) { create(:signup) }

     NameError:
       uninitialized constant Signup
编辑:我忘了提一些重要的东西 - 实际的代码都适用于所有3种语言的用户注册,所以我确信这绝对是我缺乏测试错误的经验。

1 个答案:

答案 0 :(得分:1)

subject(:mail) do
  UserMailer.confirmation_instructions(user, user.confirmation_token)
end

这当然会有所不同,具体取决于您的具体实现,但您的用户类应该生成令牌:

require 'secure_random'

class User
  before_create :generate_confirmation_token!

  def generate_confirmation_token!
    confirmation_token = SecureRandom.urlsafe_base64
  end
end

创建一个单独的工厂是不必要的,并且由于FactoryGirl将尝试创建Signup的实例,而我猜测你没有。

工厂不是固定装置。