2017-12-11 5 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 result.idundefined method 'id' for nil:NilClassというエラーになります。 FactoryGirlを使って新しいレコードを作成しようと考えていたので、このエラーメッセージが表示されませんでした。私はRSpecの/ Railsのに新しいです、これは正しいアプローチである場合しかし、私はよく分からない

+1

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を返しfind_user_idあなたのクラスメソッドは、(FactoryGirlrenamed a couple of weeks agoだったことに注意)にリンターでのビルドを持っていることを確認する必要がありますすべてのファクトリが有効なインスタンスを生成するようにしてください。ドキュメントのLinting Factoriesを参照してください。リンターを使用する方法

非常に簡単な例は次のようになります。

# spec factory_linter_spec.rb 
require 'spec_helper' 

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

を、あなたのモデルの仕様にfactoryGirl create機能をチェックするために、レールモデルに

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 methods 'id' for nil:NilClass'を取得しませんでした。私はそれが正しいことを願っています。私が最初に尋ねる方法を本当に知りませんでしたというあいまいな質問にお答えいただき、ありがとうございます。 – CiCi

関連する問題