5
2

More than 1 year has passed since last update.

【Rspec】system testで並び順をテストする

Last updated at Posted at 2022-02-04

結論

正規表現を使うパターン

  describe "並び順" do
    let!(:task1) { Task.create(name: "name1", content: "content1" }
    let!(:task2) { Task.create(name: "name2", content: "content2" }
    it "作成されたタスクが作成日時の降順になっていること" do
      visit "/tasks"
      expect(page.text).to match(/#{task1.name}.*#{task2.name}/)
    end
  end

      #改行を含む場合は
      expect(page.text).to match(/#{task1.name}[\s\S]*#{task2.name}/)

上記は、task1→task2の順番で画面上に表示されていることを検証するテストです。
(/#{@task1.name}.*#{@task2.name}/)の部分で順番のチェックをしています。
ここで.[\s\S]*は正規表現で

記号 意味
. 任意の一文字
s 空白、タブ、フォーム フィードなどの任意の空白文字
S 空白文字以外の任意の文字
* 直前の文字を0回以上繰り返す

という意味を持ちます。

つまり、task1→任意の文字列→task2で表示されていることがテストできます。

正規表現を使わないパターン

  describe "並び順" do
    before do
      Task.create(name: "name1", content: "content1", created_at: Time.zone.now)
      Task.create(name: "name2", content: "content2", created_at: 1.day.from_now)
      Task.create(name: "name3", content: "content3", created_at: 1.day.ago)
    end
    it "作成されたタスクが作成日時の降順になっていること" do
      visit "/tasks"
      within ".tasks" do
        task_names = all(".task-name").map(&:text)
        expect(task_names).to eq %w(name2 name1 name3)
      end
    end
  end

上記はhttps://qiita.com/fujimura/items/3adbeec55db32aba396f#comment-5669403d3fa41b8d84a を参考にさせていただきました。

ここで正規表現を使うときとの変更部分は、let!ではなくbeforeを使っている点です。
RSpec/LetSetup: Do not use let! to setup objects not referenced in tests.

つまった部分

正規表現

最初は、
Capybaraで画面要素の表示順を検証するを参考にさせていただき
.*で記述していたのですが、テストが通りませんでした。
理由は、.*では改行が認識できず、実際のコードと一致しなかったためです。

もし同様の理由で、テストが通らない場合は[\s\S]で記述してみてください。

letとlet!

また、インスタンス変数でなくletを使う場合、予めtask1,2を作成しておく必要があるためlet!を使用します。
参考:使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」/遅延評価される let と事前に実行される let!

5
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2