저는 TDD를 처음 사용하기 때문에 분명한 사실 이니 저를 용서해야 할 것입니다.하지만 Devise와 Omniauth를 사용하여 로그인 시스템을 개발하고 있습니다. 하지만 어떤 이유로 rspec 테스트를 실행할 때 실패합니다.dev_sign_in_and_redirect가 rspec 테스트를 실패하게 만듭니다.
나는 경우, 내가 테스트를 실행하면 내가 실제로
Failure/Error: get :create
NoMethodError:
undefined method `user' for nil:NilClass
# ./app/controllers/authentications_controller.rb:13:in `create'
을 얻을
describe "GET 'create'" do
before(:each) do
request.env['omniauth.auth'] = { "provider" => "facebook", "uid" => "1298732", "info" => { "first_name" => "My", "last_name" => "Name", "email" => "[email protected]" } }
end
it "should create a user" do
lambda do
get :create
end.should change(User, :count).by(1)
end
end
이 RSpec에 테스트 내 인증 컨트롤러
class AuthenticationsController < ApplicationController
def create
omniauth = request.env['omniauth.auth']
authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
if authentication
flash[:notice] = "Signed in successfully"
sign_in_and_redirect(:user, authentication.user)
else
user = User.find_by_email(omniauth['info']['email']) || User.new(:email => omniauth['info']['email'], :fname => omniauth['info']['first_name'], :lname => omniauth['info']['last_name'])
user.authentications.build(:provider => omniauth['provider'], :uid => omniauth['uid'])
if user.save :validate => false
flash[:notice] = "Login successful"
sign_in_and_redirect(:user, user)
else
flash[:notice] = "Login failed"
redirect_to root_path
end
end
end
end
의 생성 작용을 테스트하고 있습니다 sign_in_and_redirect 문을 제거하면 테스트가 통과됩니다. 흥미롭게도 sign_in_and_redirect 대신 sign_in을 사용하면 실패합니다.
왜 이런 일이 일어날 지 알고 계십니까? 특히 개발할 때 계정을 직접 만들면 잘 작동하므로 ...
미리 도움을 청하십시오! 당신은 유증의 유틸리티 방법 중 하나를 사용하는 경우
확신 문제. 에 분명히, 테스트 내에서 고안의 sign_in 방법을 사용하기 위해 전화를 걸해야합니다 가 고안 :: TestHelpers를 포함한 후 포함, 내 문제는 멀리 가서 모든 기능이 제대로 작동하는 것 같다. –