2017-12-11 1 views
-2

FactoryGirl을 사용하여 User.find_user_id 클래스 메소드에 대한 테스트를 작성하려면 어떻게해야합니까?RSpec에서 FactoryGirl을 사용하여 새 레코드가 생성되었는지 테스트하는 방법은 무엇입니까?

Class User < ActiveRecord::Base 

    def self.find_user_id (name) 
    result = User.find_or_create_by(name: name) 
    return result.id 
    end 
end 

편집 : 처음에는 나 자신을 분명히하지 않았습니다. 테스트에서 내가 원하는 것은 User.find_user_id으로 전화하면 User.find_or_create_by 라인에 도달했기 때문입니다.

expect(User).to received(:find_or_create_by)을 사용했지만 result = nil이되고 return 문 return result.idundefined method 'id' for nil:NilClass이됩니다. FactoryGirl을 사용하여 새 레코드를 만들려고 했으므로이 오류 메시지가 표시되지 않습니다. 내가 RSpec에/레일에 새로운 오전으로이 올바른 방법입니다하지만 잘 모르겠어요

+1

당신은 명확하게해야한다 모델 사양에 factoryGirl create 기능을 확인하는 레일 모델에서 valid?을 사용할 수 있습니다 먼저 테스트하고 싶은 것. 당신의 상황에서 새로운 레코드를 테스트하기를 원한다면,'데이터베이스의 변화를 테스트하는 방법'을 생각해야합니다. 메소드에서 반환되는 값을 테스트하려면 다른 방법으로 생각하십시오. 새로운 질문을 시작하기 전에'factory-bot'의 문서 + google을 참조하십시오. – yeuem1vannam

+0

'FactoryBot' (이전의'FactoryGirl')이 왜 작동하는지 테스트하고 있습니까? 그들은 그들 자신의 시험을 가지고있다. 'FactoryBot'과 전혀 관계가없는'User # find_user_id' 메소드를 테스트하는 방법을 실제로 묻고 있기 때문에 질문의 제목은 몸체와 일치하지 않습니다. – engineersmnky

답변

1

1.You는 다음과 같이 User 모델의 공장해야합니다

FactoryGirl.define do 
    factory :user do 
    name: 'Stefen' 
    end 
end 

2.As 수업 방법을 find_user_id 해당 메서드에 name이 전달 된 사용자의 ID를 반환합니다.

describe '.find_user_id' do 

    before do 
    @user = FactoryGirl.create(:user) 
    end 

    it 'should find user id by name' do 
    find_user_id(@user.name).should eq @user.id 
    end 

end 

3.In RSpec에, 그것은 당신의 클래스 메소드는이 id

+0

이 답변은 정확할 수 있지만, 장기적으로이 질문을 개선하십시오. –

+0

피드백 마이크에 감사드립니다. – Rhunal

1

FactoryBot (FactoryGirlrenamed a couple of weeks ago 것을 주) 반환 find_user_id 있는지 확인해야합니다에 린터에서 빌드를 가지고 : 그래서, 사양은 다음과 같이 쓸 수있다 모든 팩토리가 유효한 인스턴스를 생성하는지 확인하십시오. 설명서에서 Linting Factories을 참조하십시오.

방법 린터를 사용하는 방법과 같을 수 있습니다 매우 간단한 예 :

# spec factory_linter_spec.rb 
require 'spec_helper' 

Rspec.describe 'FactoryBot' do 
    it 'creates valid instances' do 
    FactoryBot.lint 
    end 
end 
2

당신이

RSpec.describe User, :type => :model do 
    let(:user) { FactoryGirl.create(:user) } 
    it { is_expected.to be_valid } 
end 
+0

"FactoryGirl을 사용하여 User.find_user_id 클래스 메소드에 대한 테스트를 작성하려면 어떻게합니까?"라는 질문에는 대답이 없습니다. – engineersmnky

+0

이'let (: user) {FactoryGirl.create (: user)}'는 내 문제에 대한 답입니다! 이름이 db에없는 경우 테스트하는 방법을 알 수 없습니다. 'let'을 사용하여'allow (User) .to (: find_or_create_by) .and_return (user) '을 허용 할 수 있었고'undefined method'id 'for nil : NilClass'을 얻지 못했습니다. 나는 그것이 올바르게했기를 바란다. 애매 모호한 질문에 대답 해 주셔서 대단히 감사합니다. 처음에는 묻는 법을 모르는 사람이었습니다. – CiCi

관련 문제