使用OmniAuth在Factory Girl中创建用户?

Som*_*ock 5 integration-testing rspec ruby-on-rails omniauth factory-bot

我目前正在创建一个使用OmniAuth创建和验证用户的应用程序.我在测试期间遇到问题,因为Factory Girl无法在没有OmniAuth的情况下生成用户.

我有几种不同的方法让工厂女孩用omniauth创建用户,但没有一个成功.

我在spec_helper文件中添加了以下两行

OmniAuth.config.test_mode = true \\ allows me to fake signins
OmniAuth.config.add_mock(:twitter, { :uid => '12345', :info => { :nickname => 'Joe Blow' }})
Run Code Online (Sandbox Code Playgroud)

目前的工厂.rb

FactoryGirl.define do
  factory :user do
    provider "twitter"
    sequence(:uid) { |n| "#{n}" }
    sequence(:name) { |n| "Person_#{n}" }
  end
end
Run Code Online (Sandbox Code Playgroud)

以下测试当前失败,因为没有生成用户

let(:user) { FactoryGirl.create(:user) }
before { sign_in user }

describe "registering" do

  it "should increment" do
    expect do
      click_button 'register'
    end.to change(user.rounds, :count).by(1)
end
Run Code Online (Sandbox Code Playgroud)

我应该如何更改我的工厂/测试以使Factory Girl使用OmniAuth创建测试用户?

编辑:我使用RailsCast指南来设置Omniauth,

#create function inside user.rb
def self.create_with_omniauth(auth)
  create! do |user|
    user.provider = auth["provider"]
    user.uid = auth["uid"]
    user.name = auth["info"]["name"]
  end
end
Run Code Online (Sandbox Code Playgroud)

希望也有用

#create inside the session_controller
def create
  auth = request.env["omniauth.auth"]
  user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) ||    User.create_with_omniauth(auth)
  session[:user_id] = user.id
  redirect_to root_url, :notice => "Signed in!"
end
Run Code Online (Sandbox Code Playgroud)

Tan*_*ili 2

您是否记得在测试设置中的某个位置执行以下操作?

request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:twitter]

如果这样做,用户的 UID 是否可能与模拟 UID 不匹配?

您可以尝试将工厂定义从 更改sequence(:uid) { |n| "#{n}" }uid '12345'