🐙

Ruby on Railsのデバック(raise 〇〇.inspect)の方法について

2024/01/04に公開

デバックとは

プログラムを書いて開発する時などに、エラーは必ず出てきます。
その際人間の目で見ることは限界があるので、デバックのツールや手法を使って、
開発者はコードの手直しをしていきます。

この記事の背景

Railsで開発をしている時に今まではbinding.pryというデバックの手法しか知りませんでした。

https://qiita.com/Hashimoto-Noriaki/items/d4ec952005465e39f618

今、入っているプロジェクトがbinding.pryを使わない案件でした
そこで教わったのがraise 〇〇.inspectを使った手法でした。

使い方

かなり省いていますが、以下がテストコードです。このコードを軸にデバックを説明していきます。

describe 'logテスト' do
      subject { described_class.new.log(order) }
      let(:order) do
        {
          :order_number=>"1", 
          :details=>[
            ["20230914", "1994", "株式会社Taro"]
          ]
        }
      end

#省略

以下がテスト対象のコードです。

def log(order)
    order_detail = order.dig(:details, 0)
    raise order.inspect
    #省略
  end

⚫︎補足
{}は連想配列(ハッシュ)[[]]は配列です。

RSpecを実行すると以下のように出ます。Runtime/Errorが出れば
デバックはできています。

Failures:

  #省略
     Failure/Error: raise order.inspect
     
     RuntimeError:
       {:order_number=>"1", :details=>[["20230914", "1994", "株式会社Taro"]]}
     # .〇〇.rb:87:in `log'
     # .〇〇.rb:263:in `block (4 levels) in <top (required)>'
     # .〇〇.rb:275:in `block (6 levels) in <top (required)>'
     # .〇〇.rb:275:in `block (5 levels) in <top (required)>'

Finished in 0.06517 seconds (files took 10.54 seconds to load)
1 example, 1 failure

raise order.inspectを入れたことで引数(order)の中身を見ることができます。
記事のタイトルの〇〇には引数が入ります。

今度はdetailの中身を見ていきます。

def log(order)
    order_detail = order.dig(:details, 0)
    raise order[:details].inspect#追記
    #省略
  end

これで :detailsの中身を見ることができます。

 #省略
     Failure/Error: raise order[:details].inspect
     
     RuntimeError:
       [["20230914", "1994", "株式会社Taro"]]
     # .〇〇.rb:88:in `log'
     # .〇〇.rb:263:in `block (4 levels) in <top (required)>'
     # .〇〇.rb:275:in `block (6 levels) in <top (required)>'
     # .〇〇.rb:275:in `block (5 levels) in <top (required)>'

Finished in 0.06826 seconds (files took 9.85 seconds to load)
1 example, 1 failure

Failed examples:

さっきと比べたらRuntimeErrorと比べたらdetailsの中身だけになっています。
detailsの中の"20230914"のみを取得したい場合は以下のように追記します。

def log(order)
    order_detail = order.dig(:details, 0)
    raise order[:details][0][0].inspect#追記
  end

   # Failure/Error: raise order[:details][0][0].inspect
     
   #  RuntimeError:
    #   "20230905"

raise order[:details][0][1]にすれば"1994"が取得できます。

資料

デバックについて色々書いてあるので読んでみてください。

https://qiita.com/nishina555/items/e5886339d381db61b412#エラー画面に出てくるトレースの種類とその説明

補足

2023年09月14日に投稿した記事です。都合上Zennに投稿しました。

Discussion