質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

6609閲覧

rspecでログインのテスト方法が分かりません。メールアドレスの重複エラーなどになります

axax90

総合スコア120

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2016/02/18 08:42

編集2016/02/19 05:38

factorygirlで、
テストを走らせた時に、ユーザーを作成し、そのユーザーの値でログインをしたいんですが、うまくいきません。

↓のようなコードで、

ruby

1 2RSpec.describe 'sign in', type: :request do 3 let(:user){ FactoryGirl.create(:user) } 4 5 it do 6 with_session(:taro) do 7 post '/sign_in', user_name: user.name, password: user.password 8 . 9 . 10 end 11 end 12 13end 14

FactoryGirlは↓な感じです。

ruby

1 2FactoryGirl.define do 3 factory :user do 4 email 'test_user@example.com' 5 username 'test_user' 6 . 7 . 8 end 9end 10

1回テストを走らせたあとに、もう一度テストを走らせ、binding.pryで止めて

ruby

1 2RSpec.describe 'sign in', type: :request do 3 let(:user){ FactoryGirl.create(:user) } 4 5 it do 6 with_session(:taro) do 7 binding.pry 8 post '/sign_in', user_name: user.name, password: user.password 9 end 10 end 11 12end 13
> user1 ActiveRecord::RecordInvalid: バリデーションに失敗しました。メールは既に使われています。

とすると、というエラーが出ます。

テストのDBはテストを走らせる度に毎回つくられるものではない?

テストのDB登録時にメール重複のエラーなど出ないようにするには、どうすればよいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Userのemailはユニーク制限がかかっていませんか?
であれば、:user1と:user2で同じデータソースを使っているので、ユニーク制限に引っかかってcreate出来ないでしょう。

Ruby

1FactoryGirl.define do 2 factory :user1 do 3 email 'test_user1@example.com' 4 username 'test_user1' 5 . 6 . 7 end 8 9 factory :user2 do 10 email 'test_user2@example.com' 11 username 'test_user2' 12 . 13 . 14 end 15end 16 17RSpec.describe 'sign in', type: :request do 18 let(:user1){ FactoryGirl.create(:user1) } 19 let(:user2){ FactoryGirl.create(:user2) } 20# 以下略

こんな感じで、定義を分けてあげないといけないでしょう

投稿2016/02/18 09:19

rifuch

総合スコア1901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

axax90

2016/02/19 04:58

ちょっとだけ、自分の投稿内容を内容を変えました。 user1やuser2など関係なかったです。。 ご指摘頂いた内容ですと、テストを1回走らせたときは大丈夫ですが、 もう一度テストを流すと、そこでユニーク制限にひっかかりませんか..? そもそもテストは、毎回走らせる度に、DBを初期化するとかなんでしょうか? すいません、何もわかってなくて。。
axax90

2016/02/19 05:24

そもそもログイン(sign in)のテストに、毎回userをcreateするのが違うのでしょうか..?
axax90

2016/02/19 05:31 編集

ログインのテストは、何回走らせても大丈夫なように ```ruby email { Faker::Internet.email } ``` とかってするのでしょうか..??
axax90

2016/02/19 07:49

database_cleanerというのを使ってなくて、おかしくなってたみたいです。。 すいません、ありがとうございました!
rifuch

2016/02/19 10:29

Rspecはあまり使っておらず、ActiveSupport::TestCaseの方ばかりなのであまり詳しくはありませんが、基本的に、一つのテストを行うたびに、その前後にSetupとTeardownが行われるようになっているはずです。 なので、一つのテスト内部でユニーク制限に違反するようなテストを書かない限り、問題は起きない事になっています。
guest

0

user1とuser2でメールアドレスがぶつかっています。
以下でぶつからないメールアドレスが生成可能です。

ruby

1FactoryGirl.define do 2 factory :user do 3 sequence :email do |n| 4 "test_user#{n}@example.com" 5 end 6...

投稿2016/02/18 09:19

編集2016/02/18 13:37
miyamiya

総合スコア691

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

axax90

2016/02/19 05:13

ご指摘いただいたsequenceの方法は、1回目は大丈夫ですが、 再び2回目のテストを流した時に、メールアドレスの重複にならないでしょうか。 テスト用のDBは毎回初期化するのでしょうか... わかってなくてすいません。。
axax90

2016/02/19 05:24

そもそもログイン(sign in)のテストに、毎回userをcreateするのが違うのでしょうか..?
axax90

2016/02/19 07:49

database_cleanerというのを使ってなくて、おかしくなってたみたいです。。 すいません、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問