

現在Ruby on Railsにてコントローラーのテストを行っております。  
以下のエラーが解消できません。

bundle exec rspec spec/requests/nutritions_spec.rbの実行結果

[code]

         Failure/Error: expect(response.body).to include @nutrition.calorie
    
     TypeError:
       no implicit conversion of Float into String
     # ./spec/requests/nutritions_spec.rb:21:in `block (3 levels) in <top (required)>'
    
[/code]

nutritionsコントローラーというもののテストコードを記述しております。その際に以下のようなテストコードを書いております。そのうち、「indexアクションにリクエストするとレスポンスに登録済みの食品名が存在する」「indexアクションにリクエストするとレスポンスに登録済みのカロリーが存在する」にて同一のエラー分が返ってきます。

【nutritions_spec.rb】

[code]

        describe NutritionsController, type: :request do
    
      before do
        @nutrition = FactoryBot.create(:nutrition)
      end
    
    
    
      describe "GET #index" do
        it "indexアクションにリクエストすると正常にレスポンスが返ってくる" do
          get root_path
          expect(response.status).to eq 200
        end
        it "indexアクションにリクエストするとレスポンスに登録済みの食品名が存在する" do
          get root_path
          expect(response.body).to include @nutrition.ingredient
        end
        it "indexアクションにリクエストするとレスポンスに登録済みのカロリーが存在する" do
          get root_path
          expect(response.body).to include @nutrition.calorie
        end
        it "indexアクションにリクエストするとレスポンスに登録済みのタンパク質が存在する" do
          get root_path
          expect(response.body).to include @nutrition.protein
        end
    
        it "indexアクションにリクエストするとレスポンスに投稿検索フォームが存在する" do
        end
      end
    end
    
[/code]

float型であることに文句を言われているのでFactoriesが怪しいなと思い、色々型を変えてみたのですが、解決できませんでした。  
【factories/nutritions.rb】

[code]

      factory :nutrition do
    
        ingredient {Faker::Lorem.sentence}
        calorie {"300"}
        protein {"300"}
        lipid {"300"}
        carbohydrate {"300"}
        potassium {"300"}
        calcium {"300"}
        iron {"300"}
        vitamin_a {"300"}
        vitamin_b1 {"300"}
        vitamin_b2 {"300"}
        vitamin_c {"300"}
        dietary_fiber {"300"}
        association :user
      end
    end
    
[/code]

対象のindex.html.erbは以下です。

[code]

    <div class="index-contents">
      <div class="index-image">
        <%= image_tag ('/index3.jpg') %>
      </div>
    </div>
    <div class="index-text">
      Beriiesは食材の各栄養素を管理できるアプリです。<br>
      食材一覧からお好みの食材の栄養素をチェックしてみましょう。
    </div>
    
    
    <%= form_with(url: search_nutritions_path, local: true, method: :get, class: "search-form") do |form| %>
      <%= form.text_field :keyword, placeholder: "さっそく食材を検索しよう！", class: "search-input" %>
      <%= form.submit "Search", class: "search-btn" %>
      <% if user_signed_in? %>
      <div>検索しても無ければここから食材を登録しよう！</div>
      <div class="index-new">
        <%= link_to "食品登録", new_nutrition_path, class: "new-btn" %>
      </div>
      <% else %>
      <div class="index-new">
        <p class="letter-spacing"> 登録がなかったら新規登録してみましょう！<br>初めての方はここからかんたんログイン！</p>
        <%= link_to 'かんたんログイン', users_guest_sign_in_path, method: :post, class: "new-btn"%>
        <p class="login-select"> 登録済みの方　　新規会員登録</p>
        <%= link_to "Log In", new_user_session_path, class: "new-btn2" %>
        <%= link_to "Sign Up", new_user_registration_path, class: "new-btn2" %>
      </div>
      <% end %>
    
    
    <% end %>
    
    <script src="delete.js"></script>
    
    <div class='main-contents'>
    
        <h1 class="contents-title">食品一覧<EM STYLE="font-size: large;">(100gあたり)</EM></h1>
        <table border="5" width="80%" cellpadding="20" bordercolor="#882d91" class="contents-column" align="left">
          <tr class="column-name">
            <th width="30%" height="50">食品名</th>
            <th class="column-color1" width="15%">エネルギー(kcal)</th>
            <th class="column-color1" width="15%">タンパク質(g)</th>
            <th class="column-color1" width="15%">脂質(g)</th>
            <th class="column-color1" width="15%">炭水化物(g)</th>
            <th class="column-color2" width="15%">カリウム(mg)</th>
            <th class="column-color2" width="15%">カルシウム(mg)</th>
            <th class="column-color2" width="15%">鉄(mg)</th>
            <th class="column-color3" width="15%">ビタミンA(mg)</th>
            <th class="column-color3" width="15%">ビタミンB1(mg)</th>
            <th class="column-color3" width="15%">ビタミンB2(mg)</th>
            <th class="column-color3" width="15%">ビタミンC(mg)</th>
            <th width="15%">食物繊維(g)</th>
            <%#<th width="15%">登録ユーザー</th>%>
          </tr>
    
          <% @nutritions.each do |nutrition| %>
            <tr height="60" class="content-post">
              <%# サインインしているかつ、お気に入り登録している食品は★がつき、カラーは赤になる%>
              <% if user_signed_in? %>
                <% if current_user.already_favorited?(nutrition, current_user) %>
                  <td class="ingredient-column fav-color" id="ingredient-column">★<%= nutrition.ingredient %>
                <% else %>
                  <td class="ingredient-column" id="ingredient-column"><%= nutrition.ingredient %>
                <% end %>
              <% else %>
                <td class="ingredient-column" id="ingredient-column"><%= nutrition.ingredient %>
              <% end %>
              <div class="more" id="more">
                <ul class="more-list" id="more-list">
                  <li>
                    <% if user_signed_in? %>
                      <% if current_user.already_favorited?(nutrition, current_user) %>
                        <%# 解除の引数としてid:0を渡しているがこれが無いとidがないというエラーが起きてしまうので応急処置 %>
                        <%= link_to '解除', nutrition_favorites_path(user_id:current_user.id, nutrition_id:nutrition.id, id:0), :style=>"color:green;", method: :delete %>
                      <% else %>
                        <%= link_to '登録', user_favorites_path(user_id:current_user.id, nutrition_id:nutrition.id), :style=>"color:green;", method: :post %>
                      <% end %>
                      <% if current_user.id == nutrition.user.id %>
                        <%= link_to '編集', edit_nutrition_path(nutrition.id), :style=>"color:green;", method: :get %>
                        <%= link_to '削除', nutrition_path(nutrition.id), :style=>"color:green;", method: :delete, data: { confirm: '削除しますか？'} %>
                      <% end %>
                    <% end %>
                  </li>
                </ul>
              </div>
            <td><%= number_with_precision(nutrition.calorie, precision: 1, strip_insignificant_zeros: true) %></td>
            <td><%= number_with_precision(nutrition.protein, precision: 1, strip_insignificant_zeros: true) %></td>
            <td><%= number_with_precision(nutrition.lipid, precision: 1, strip_insignificant_zeros: true) %></td>
            <td><%= number_with_precision(nutrition.carbohydrate, precision: 1, strip_insignificant_zeros: true) %></td>
            <td><%= number_with_precision(nutrition.potassium, precision: 1, strip_insignificant_zeros: true) %></td>
            <td><%= number_with_precision(nutrition.calcium, precision: 1, strip_insignificant_zeros: true) %></td>
            <td><%= number_with_precision(nutrition.iron, precision: 1, strip_insignificant_zeros: true) %></td>
            <td><%= number_with_precision(nutrition.vitamin_a, precision: 1, strip_insignificant_zeros: true) %></td>
            <td><%= number_with_precision(nutrition.vitamin_b1, precision: 1, strip_insignificant_zeros: true) %></td>
            <td><%= number_with_precision(nutrition.vitamin_b2, precision: 1, strip_insignificant_zeros: true) %></td>
            <td><%= number_with_precision(nutrition.vitamin_c, precision: 1, strip_insignificant_zeros: true) %></td>
            <td><%= number_with_precision(nutrition.dietary_fiber, precision: 1, strip_insignificant_zeros: true) %></td>
          </tr>
        <% end %>
      </table>
    </div>
    
[/code]

また、マイグレーションファイルは以下になります。

[code]

      def up
        change_column :nutritions, :protein, :float
        change_column :nutritions, :lipid, :float
        change_column :nutritions, :carbohydrate, :float
        change_column :nutritions, :potassium, :float
        change_column :nutritions, :calcium, :float
        change_column :nutritions, :iron, :float
        change_column :nutritions, :vitamin_a, :float
        change_column :nutritions, :vitamin_b1, :float
        change_column :nutritions, :vitamin_b2, :float
        change_column :nutritions, :vitamin_c, :float
        change_column :nutritions, :dietary_fiber, :float
        rename_column :nutritions, :dietary_fiber, :dietary_fiber
      end
    end
    
[/code]

お力添頂けますと幸いです。


CC BY-SA 4.0
2020-11-15T11:32:40.500
71969
2020-11-16T02:30:19.383
2020-11-16T02:30:19.383
42341
question
ruby-on-rails rspec
no implicit conversion of Float into Stringが解消できない