

実行環境  
rails 7.0.3  
ruby 3.1.2  
rspec 3.11

ブラウザで操作した際には期待したpathに遷移することが確認できるのですが、RSpecのsystemテストでは期待したpathになっておらず、テストが落ちてしまいます。

著者の名前を登録するだけのシンプルなフォームのテストで名前が空欄の時には、エラーメッセージが表示され、新規登録画面をレンダリングするというテストでなぜ失敗するのかわからず質問させていただきます。

### 実装内容

routes.rb

[code]

    resources :authors
    
[/code]

app/model/author.rb

[code]

    validates :name, presence: true
    
[/code]

app/controller/authors_controller

[code]

    def new
      @author = Author.new
    end
    
    def create
      @author = Author.new(author_params)
      if @author.save
       redirect_to authors_path, notice: "#{@author.name}を登録しました"
      else
        render :new, status: :unprocessable_entity
      end
    end
    
    private
    
    def author_params
      params.require(:author).permit(:name)
    end
    
[/code]

app/views/authors/new.html.haml

[code]

    = simple_form_for @author do |f|
      = f.input :name
      = f.button :submit
    
[/code]

spec/system/authors_spec.rb

[code]

       context '必須項目の名前が入力されていない時' do
          it '作成できない' do
            visit new_author_path
            click_button '登録する'
    
            expect(page).to have_content '著者名を入力してください'
            expect(page).to have_current_path new_author_path
          end
        end
    
[/code]

上記の`author_spec.rb`の実行結果が著者の一覧画面を期待するとなってしまい、失敗します。

` 1) 著者の新規登録 必須項目の名前が入力されていない時 作成できない Failure/Error: expect(page).to
have_current_path new_author_path expected "/authors" to equal "/authors/new"`


CC BY-SA 4.0
2022-10-15T09:53:39.717
91611
2022-10-17T02:11:14.153
2022-10-17T01:44:26.447
54856
54856
question
ruby-on-rails ruby
railsで新規登録フォームを作成し、RSpecで名前が空欄の時に失敗するというテストを書いた際に、have_current_pathで失敗後の遷移先として新規登録画面を期待するというテストを書いたのですが、なぜか一覧画面を期待してしまいテストが失敗してしまいます。


自分は経験が浅いですが、気になったので書き込みました。  
ユーザーログインをして登録というかたちでしょうか？  
ユーザー作成、ログインなどの記載がみられていないところから、  
ログインしていないので、一覧画面に遷移しているのかと思いました。  
検討違いなことを言っていたら申し訳ないです。


CC BY-SA 4.0
2022-10-16T12:16:30.167
91630
2022-10-16T12:16:30.167
54507
91611
answer


> ブラウザで操作した際には、期待したpathに遷移することが確認できる

確認:  
これは「著者名を入力してください」が表示されている画面の URL パスが `/authors/new` になっているということでしょうか?
表示される画面の内容は /authors/new テンプレートの内容であるものの、URL パスは `/authors` であったりしないでしょうか?

説明:  
通常 routes.rb で `resources :authors` とすると `create` アクションは `post /authors`
と関連付けられます。そして `create` アクションではエラー、つまり `@author.save` が `falsy` の場合は
`redirect_to` せず `render :new` しています。これは `post /auhtors` によって authors/new
テンプレートを表示するものなので、URL パスは `/authors` から変わらないはずです。

また、この URL パスは一覧 = `index` アクション = `get /authors`と同じものであり、実際にテストで actual value
として報告されているものです。

> ブラウザで操作した際には、期待したpathに遷移することが確認できる

繰り返しになりますが、エラー発生時の path は `/authors` ※1 になっていないでしょうか? 表示される内容は authors/new
テンプレートのもの※2 だと思います。  
※1 `create` アクション `post /authors` の HTTP メソッドを除いた URL パス  
※2 `render :new` の結果

補足:  
なのでテストとしては次の 2点を expect することになると思います。

  * URL パスは authros_path であること
  * ページの内容が新規登録画面フォームであること


CC BY-SA 4.0
2022-10-16T14:30:50.940
91635
2022-10-16T14:30:50.940
54859
91611
answer


> これは「著者名を入力してください」が表示されている画面の URL パスが /authors/new になっているということでしょうか?

そうです。

> 表示される画面の内容は /authors/new テンプレートの内容であるものの、URL パスは /authors であったりしないでしょうか?

著者の作成に失敗すると、エラーメッセージが表示され、エラー発生時のURLパスもちゃんと /authors/newになっています。


CC BY-SA 4.0
2022-10-17T02:09:00.423
91639
2022-10-17T02:11:14.153
2022-10-17T02:11:14.153
54856
54856
91611
answer