🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Q&A

解決済

1回答

1056閲覧

RspecのテストコードのDRY化

norigram

総合スコア1

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

0グッド

0クリップ

投稿2021/01/09 22:59

編集2021/01/09 23:00

RailsのテストコードをもっとDRYにしたい

Rails on Rubyでアプリケーションのテストコードを書いているんですが、
もっとDRYなコードにしたくて、インスタンス変数をletに置き換えてるのですが、
FactoryBotでランダムに生成したインスタンスをletに代入して、
後で使いまわしたいのですが、わからないなりに実装した結果
余計に冗長なコードになってしまいました。
もっとシンプルにする方法があれば教えてください。

コード

Ruby

1describe User do 2 let(:fakeUser) {build(:user)} 3 4 let(:email) {fakeUser.email} 5 let(:password) {fakeUser.password} 6 let(:password_confirmation) {fakeUser.password} 7 let(:nickname) {fakeUser.nickname} 8 let(:last_name) {fakeUser.last_name} 9 let(:first_name) {fakeUser.first_name} 10 let(:last_name_kana) {fakeUser.last_name_kana} 11 let(:first_name_kana) {fakeUser.first_name_kana} 12 let(:birth_date) {fakeUser.birth_date} 13 14 let(:user){User.new( 15 nickname: nickname, 16 email: email, 17 password: password, 18 password_confirmation: password_confirmation, 19 first_name: first_name, 20 last_name: last_name, 21 first_name_kana: first_name_kana, 22 last_name_kana: last_name_kana, 23 birth_date: birth_date 24 )} 25 subject{user} 26 shared_examples '登録できる' do 27 it { is_expected.to be_valid } 28 end 29 shared_examples '登録できない' do 30 it { is_expected.to be_invalid } 31 end 32 describe 'すべての項目' do 33 context 'nickname、email、password、password_confirmation、last_name、first_name、last_name_kana、first_name_kana、birth_dateが存在する時' do 34 it_behaves_like '登録できる' 35 end 36 end 37 describe 'nicknameの検証' do 38 context '空の場合' do 39 let(:nickname){nil} 40 it_behaves_like '登録できない' 41 end 42 end 43end

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

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

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

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

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

guest

回答1

0

ベストアンサー

let(:fakeUser) {build(:user)}
をbotで作って、それを元にuserをつくるということは
let(:user){ build(:user) }
となんら変わらん、とおもうのですが。

投稿2021/01/10 03:07

winterboum

総合スコア23567

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

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

norigram

2021/01/10 04:10

ご回答ありがとうございます! そうすると、その後各テストを実施する時に、letを使ってuserの例えばnicknameなどをnilに書き換えてログインできない場合の検証ができなくて、困り仕方なく間にletを挟んでいるんです。 letがイマイチよく分からなくて、すみません。
winterboum

2021/01/10 04:50

そういう場合 create { :user, nickname: nil} の様にします もしくはできている user.update(nickname: nil) 必須の項目だと create, update できないですが。
norigram

2021/01/10 07:58

ありがとうございますー! 解決しました!その都度作ればよかったんですね!考え方が根本からおかしかったことに気づけました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問