8

Ứng dụng Rails 3.2 của tôi sử dụng OmniAuth và Devise để đăng nhập bằng Twitter. Hệ thống xác thực hoạt động tốt. Tôi muốn viết một bài kiểm tra tích hợp trong rspec để đảm bảo mọi thứ hoạt động. Sử dụng thông tin trong wiki, tôi đã viết những điều sau đây, nhưng tôi biết tôi đang thiếu những thứ.Rails rspec và omniauth (kiểm thử tích hợp)

Dưới test.rb trong config/môi trường, tôi đã những dòng sau

OmniAuth.config.test_mode = true 
OmniAuth.config.mock_auth[:twitter] = {:provider => 'twitter', :uid => '123545'} 

kiểm tra rspec của tôi trông như thế này:

describe "Authentications" do 
    context "without signing into app" do 

    it "twitter sign in button should lead to twitter authentication page" do 
     visit root_path 
     click_link "Sign in with Twitter" 
     Authentication.last.uid.should == '123545' 
    end 

    end 
end 

xác thực là tên của mô hình và gọi .uid của tôi trong giao diện điều khiển đường ray trả về chuỗi tiền phạt.

Tôi nhận được lỗi sau khi tôi chạy thử nghiệm này:

Failure/Error: Authentication.last.uid.should == '123545' 
NoMethodError: 
undefined method `uid' for nil:NilClass 

bất cứ ai có thể giúp tôi tìm ra cách để sử dụng mocks OmniAuth được cung cấp? Giải thích cho lý do tại saocách hoạt động của cũng sẽ được đánh giá cao.

Trả lời

14

tôi chạy vào một cái gì đó tương tự.

Sau khi thay đổi đối tượng giả của tôi từ việc sử dụng các phím biểu tượng:

OmniAuth.config.mock_auth[:twitter] = { 
    :uid => '1337', 
    :provider => 'twitter', 
    :info => { 
     :name => 'JonnieHallman' 
    } 
    } 

để sử dụng các phím chuỗi:

OmniAuth.config.mock_auth[:twitter] = { 
    'uid' => '1337', 
    'provider' => 'twitter', 
    'info' => { 
     'name' => 'JonnieHallman' 
    } 
    } 

nó làm việc.

Và bạn có

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

đâu đó trong testcase của bạn?

+1

Xin chào! Tôi đã thử request.env ["omniauth.auth"], nhưng tôi nhận được lỗi "không xác định phương thức env cho lớp nil" – izumeroot

+0

BTW, đây là giải pháp đúng https://gist.github.com/kinopyo/1338738 – izumeroot

6

Bạn đã thử di chuyển hai dòng này đến spec_helper.rb chưa?

OmniAuth.config.test_mode = true 
OmniAuth.config.mock_auth[:twitter] = {:provider => 'twitter', :uid => '123545'} 

Ngoài ra thêm những điều sau đây trước khi khối trong tập tin thử nghiệm của bạn:

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

Bạn có thể tìm thêm thông tin vào liên kết này: https://github.com/intridea/omniauth/wiki/Integration-Testing

1

Giải pháp đã chọn không hoạt động đối với tôi. Giải pháp của tôi tôi nhận được từ https://gist.github.com/kinopyo/1338738 và chính thức doc https://github.com/intridea/omniauth/wiki/Integration-Testing đây:

# in spec/support/omniauth_macros.rb 
module OmniauthMacros 
    def mock_auth_hash 
    # The mock_auth configuration allows you to set per-provider (or default) 
    # authentication hashes to return during integration testing. 
    OmniAuth.config.mock_auth[:odnoklassniki] = OmniAuth::AuthHash.new({ 
     :provider => 'odnoklassniki', 
     :uid => '123545', 
     :info => OmniAuth::AuthHash::InfoHash.new({ 
      :name => 'mockuser' 
     }) 
    }) 

    end 
end 

# in spec/spec_helper.rb 
RSpec.configure do |config| 

    # email spec 
    config.include(EmailSpec::Helpers) 
    config.include(EmailSpec::Matchers) 
end 
OmniAuth.config.test_mode = true 

# in spec example: 
visit new_user_registration_path 
mock_auth_hash 
find('#btn-odnoklassniki').click # here is link generated as omniauth_authorize_path(resource_name, provider) 
+0

cảm ơn bạn đã chỉ đối với AuthHash.new (mặc dù nó nằm trong trang web thử nghiệm tích hợp), tôi chỉ quản lý để làm việc với koala nếu tôi có FactoryGirl của mô hình ủy quyền của tôi bao gồm bí mật và mã thông báo thực (ví dụ: sao chép và dán từ đăng nhập facebook hợp lệ quá trình chuyển đổi) – Ben

1

Tôi rất gợi this answer

Nói tóm lại ...

  • Thiết lập mô hình
  • Hãy yêu cầu
  • thử nghiệm bất cứ điều gì đang được gắn vào callback

Ví dụ: kiểm tra phiên [ 'uid'] được thành lập (mặc dù, tôi lựa chọn để kiểm tra chỉ những gì người dùng thấy, hay nói đúng hơn, không nhìn thấy)

mã của tôi ...

config/môi trường/test.rb

Rails.application.configure do 
    ... 
    OmniAuth.config.test_mode = true 
    OmniAuth.config.mock_auth[:linkedin] = { 
     'provider' => 'linkedin', 
     'uid' => '123545', 
     'info'=> 
     { 'email'=>'[email protected]', 
     'first_name'=>'Dave', 
     'last_name'=>'Wallace' } 
    } 
end 

đặc tả/tính năng/sign_in_feature_spec.rb

require 'rails_helper' 

feature 'Sign in with LinkedIn' do 

    before do 
    OmniAuth.config.add_mock(:linkedin, {:uid => '12345'}) 
    end 

    let(:user) { create(:user) } 

    scenario 'with valid email and password' do 
    visit '/' 
    expect(page).to have_no_content 'Sign Out' 
    click_link 'nav-sign-in' # image/button: Sign in with LinkedIn 
    expect(page).to have_content 'Sign Out' 
    end 
end  

Hãy cho tôi biết nếu/làm thế nào tôi có thể cải thiện giải pháp này (và mã của tôi!)

+0

Tuyệt vời! Tôi xác nhận giải pháp khắc phục sự cố – jedi

Các vấn đề liên quan