毎日やったことを記録していく(2019/4/29 22日目)

今日やったこと

英語

TOEIC® L&R テスト 文法問題 でる1000問
  • 回答数:5問
iKnow
  • 新規:0個
  • 復習:220個
スタディサプリENGLISH
  • クイックワードクイズ:1サブセクション

開発

danime-nico-tools
  • fixturesの更新
  • rakeタスク関連以外のテストを追加
    • Form(完了)
    • Model(完了)
    • Hash(未着手)

知ったこと

FactoryBotのsequence

FactoryBotではsequenceを使うと簡単に連番を付与したデータが作成できる。
ただし、安易に使うとテストが思わぬところで失敗する場合がある。

#### Sampleクラス
class Sample
  def test
    "This test is #{name}"
  end

  def test2
    "This test is #{name}"
  end
end
####

#### Sampleクラスのfactory
FactoryBot.define do
  sequence :name do |n| "sample#{n}" end

  factory :sample do
    name
  end
end
####

RSpec.describe Sample do
  describe '#test' do
    let(:sample) { create(:sample) }

    it '名前を返す' do
      expect(sample.test).to eq 'This sample is sample1' # => テストがパスする
    end
  end

  describe '#test2' do
    let(:sample) { create(:sample) }

    it '名前を返す' do
      expect(sample.test2).to eq 'This sample is sample1' # => テストが失敗する
    end
  end
end

上記のテストコードは#test2のテストが失敗する。
当初、describeでスコープが閉じていると考え、#test2のテスト時点でsequenceがリセットされてまた1から開始されると思っていたが実はそうではない。
上記のコードだと#test2時点のSamplenamesample1ではなくsample2になる。
いちいち今のsequenceによって付与されている番号を予測するのは面倒くさいし、変更に弱くなるので、値が等しいかのテストで使うような属性にはsequenceは使わない方が良さそう。

感想等

今日はovto触れなかった

結局テストだけで時間取られて今日はovto触る時間がなかった。
明日こそは今日やろうとしてたことやりたい。