FactoryBotで盛大に認識違いを繰り広げた話

プログラミングを本格的にスタートして3ヶ月目に入りましたさかもとです。

今回はFactoryBotで認識違いを起こしたせいでまたしても沼ってしまった!という話をアウトプットしようと思います。

 

FactoryBotについては前回の記事で説明をしているのでそちらをご一読ください。

 

問題点

FactoryBotでtaskモデルをこのように作成。

```

factory :task do

  sequence(:title) { |n| " 書類を作成する|n| }

  content { "取引先に書類を作成する" }

end

```

titleはユニークな値のためsequenceで。

次にこれをtasks_specで扱うために下記のようにテストの一番上に記述。

```

RSpec.describe 'Tasks' , type: :system do

     let(:task){ create(:task) }

:

:

```

これで準備は完了。テストを書き始めます。

```

:

it ' タスクの新規登録が成功する ' do

    visit  new_task_path

    fill_in ' Title ' , with: task.title

:

```

しかしこれでエラーが発生します。それはこのタイトルはすでに登録されています。というものです。

????

シーケンス でタイトルは別々の物が生成されるはずでは?

これが今回の問題です。

 

結果

今回、なぜこのような問題が起きたのか、それはコントローラーの変数と考え方がごっちゃになってしまったからです。

task.createはDBに保存される物です。なので一度よび出すとDBに保存されます。今回の場合このテスト以前に一度、呼び出しているので保存されていた分です。

また新規登録の際、DBに保存された値をもってこれないように変数で用意した値を入れてしまうと2回保存することになるので引っかかってしまったというわけです。

 

追記

まだ自分の中でも整理ができていないの今後追記などしていこうと思います。

間違った認識などありましたら教えていただけると幸いです。

```