2016-07-12 4 views
0

Rails 5가 출시되었습니다. 이제 기본 로그인/CRUD 앱을 업그레이드하여 Devise를 4.2로 업데이트하는 새로운 프레임 워크를 사용했습니다. 문제가 하나만있는 rspec 테스트를 제외하고는 상당히 직설적이었습니다. 나는 pry 코드를 밟아 보았지만 그 문제는 저를 넘어선 것이 었습니다. 모든 포인터는 감사하겠습니다.Rspec 및 Devise 4.2 : 작동했던 모델 테스트의 ArgumentError

다음
Failures: 

1) User email rejects email addresses with improper format 
    Failure/Error: expect(user).not_to be_valid 

ArgumentError: 
    wrong number of arguments (given 0, expected 1) 
# ./spec/models/problem_test_user_spec.rb:13:in `block (4 levels) in <top (required)>' 
# ./spec/models/problem_test_user_spec.rb:11:in `each' 
# ./spec/models/problem_test_user_spec.rb:11:in `block (3 levels) in <top (required)>' 

가 깎았 다운 테스트입니다 :

는 오류가 여기에
class User < ApplicationRecord 
    devise :database_authenticatable, :validatable 

    validates :email, length: { maximum: 254 } # max length per RFC 3696, errata ID 1690 
end 

내 공장 : 여기

1 require 'rails_helper' 
2 require 'devise' 
3 
4 RSpec.describe User, type: :model do 
5 let (:user) { FactoryGirl.create :user } 
6 
7 describe "email" do 
8  it "rejects email addresses with improper format" do 
9  invalid_addresses = %w[ [email protected],com user_at_foo.org [email protected] ] 
10 
11  invalid_addresses.each do |addr| 
12   user.email = addr 
13   expect(user).not_to be_valid 
14  end 
15  end 
16 end 
17 end 

그리고 나의 모델입니다

FactoryGirl.define do 
    factory :user do 
    name  { Faker::Name.name } 
    tone_name { "#{Faker::Company.name} Tone" } 
    email  { Faker::Internet.email } 
    password    SOME_PASSWORD 
    password_confirmation SOME_PASSWORD 
    admin  false 
    end 
end 

하나의 추신 : 내 개발 환경에서 앱이 제대로 실행되지만 레일스 4.2 버전이 rspec 테스트를 통과하고 잘못된 비밀번호로 캐치하는 [email protected],com 양식의 잘못된 비밀번호가 허용됩니다.

또 다른 단서 : Devise가 기본값 email_regexp을 v4.1에서 덜 엄격한 표현으로 변경했다고 배웠습니다. 이전에는 불법으로 확인 된 이메일 주소가 허용 되었기 때문에 실제로 테스트에 실패했습니다. ArgumentError이 내 코드에 없습니다. 나는 Devise 나 Rspec에서 오류라고 생각한다.

12:  invalid_addresses.each do |addr| 
    13:   user.email = addr 
    14:   binding.pry 
=> 15:   expect(user).not_to be_valid 
    16:  end 
    17:  end 
    18: end 
    19: end 

[1] pry(#<RSpec::ExampleGroups::User::Email>)> user.inspect 
ArgumentError: wrong number of arguments (given 0, expected 1) 
from /Users/tarsa/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise-4.2.0/lib/devise/models/database_authenticatable.rb:146:in `password_digest' 

유증 코드가 잘못 될 보이지 않는, 내가 액티브 일부 상호 작용이 진행되고 의심,하지만 난 : 내 테스트에서 binding.pry를 넣어 경우, 나의 모델에 대한 간단한 #inspect이 (가) 다음과 같은 원인 이 시점에서 내 디버깅 기술의 한계에 도달했습니다.

email_regexp의 4.0.3 버전을 사용하도록 Devise를 구성하면이 문제를 해결할 수 있습니다. 모든 암호 문자열이 유효하지 않은 것으로 인식되면 어디서나 버그는 간지럽지 않습니다.

+0

공장 정의는 무엇입니까? –

+0

공장 정의가 추가되었습니다. –

+0

사용자 클래스가 여전히'ActiveRecord :: Base'에서 상속 받고 있음을 주목하십시오. 새로운 슈퍼 클래스를 만들었습니까? ([참조 가이드] (http://edgeguides.rubyonrails.org/upgrading_ruby_on_rails.html#active-record-models-now) -inherit-from-applicationrecord-by-default))? 사용자는'User Huw

답변

1

문제는 Rails 5 문제가 아니지만 원래 ActiveRecord로 유효성이 검사 된 내 모델에 password_digest을 계속 사용했다는 것으로 밝혀졌습니다. 내가 Devise로 전환했을 때이 속성을 테이블에 남겼습니다. Devise 4.2.0부터 유효성 검사를 수행하는 메커니즘이 serializable_hash으로 변경되었으며 그 결과로 흔적 password_digest 속성을 호출하여 오류를 일으켰습니다.

필드를 제거하면 문제가 해결되고 테스트가 올바른 메시지와 함께 실패합니다.

Devise의 직원에게 감사의 말을 전합니다.

+0

이 솔루션을 작성해 주셔서 감사합니다, 내 문제를 해결하는 데 도움이 – widjajayd

+0

우수. 말해 주셔서 감사합니다. 자신의 질문에 대답하는 것이 항상 이상하고 도움이되는지 궁금합니다. –