Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Rspecで検証しようとした件で

実際に書いたテストコード

it '一日一回のみ投稿が可能' do
  tweet.tweet = user.tweets.length > 0 && user.tweets.last.created_at.day == Date.today.day && user.tweets.last.created_at.month == Date.today.month && user.tweets.last.created_at.year == Date.today.year
  is_expected.to eq true
end

it '投稿は七回まで' do
  user.tweets.count == 7
  is_expected.to eq true
end

Tweet.rb

validate :tweets_count_must_be_within_limit
validate :tweets_count_one_day_limit


def tweets_count_must_be_within_limit
   errors.add(:base, "投稿は七回までです") if user.tweets.count >= 7
end

def tweets_count_one_day_limit
   errors.add(:base, "本日は投稿できません") if user.tweets.length > 0 && user.tweets.last.created_at.day == Date.today.day && user.tweets.last.created_at.month == Date.today.month && user.tweets.last.created_at.year == Date.today.year
end

Rspecでテストを行おうとしています。
投稿制限をかけていて、

一日に一回のみ投稿が可能
投稿できる回数は七回まで

についてテストを行うため、一番上のようなコードを作りました。
実際に bundle exec rspec してみるとテストは成功するのですが、正しい挙動をしていると思えません。
Rspecについては学習を始めたばかりで、あまりよく理解できていません。

0

2Answer

user.tweets.count == 7
is_expected.to eq true

ここで1行目はテストになっていないただの比較式で、比較した結果は捨てられています。
2行目は expect(subject).to eq true とまったく同じ意味です。 subject が定義されていなければ動きません。

7回まで作れることをテストするには以下のようになるはずです。

it '投稿は七回まで' do
  投稿を7個作る() # 1日の投稿上限を無視して作る方法が必要になる

  expect(user.tweets.reload.count).to eq 7

  tweet = 投稿を1個作る()

  expect(tweet.errors).to be_present
  expect(user.tweets.reload.count).to eq 7
end

user.tweets.count は返り値をキャッシュするので、投稿数が変わっても同じ値を返してしまいます。 user.tweets.reload.count としてリロードする必要があります。

RSpec に慣れているなら以下のようにも書けますが、詳しくないうちは無理に色々な構文を使わなくても大丈夫だと思います。

context '投稿が7個あるとき' do
  before do
    投稿を7個作る()
  end

  subject do
    投稿を1個作る()
  end

  it '8個目は作れない' do
    expect(user.tweets.reload.count).to eq 7
    expect { subject }.not_to change { user.tweets.reload.count }
    expect(subject.errors).to be_present
  end
end
1Like

Comments

  1. @OmaeWa000

    Questioner

    回答ありがとうございます。
    いただいたコードを参考に自分自身でも理解をし直し、どのようにコードを書くか考えなおそうと思います。
    この度はありがとうございました!

パッと見だけで申し訳ないですが

一日一回のみ投稿が可能
投稿は七回まで

の個別テストは通りますが、
1日の間に7件より多く投稿した、複合のパターンはどうなりますか?

0Like

Comments

  1. @OmaeWa000

    Questioner

    回答ありがとうございます。

    >一日一回のみ投稿が可能

    なので複合のパターンというのは

    一日で二回投稿しようとした場合投稿できない

    というパターンのことでよろしいのでしょうか?

    そのテストをするためのコードの書き方についても模索中です。。。

Your answer might help someone💌