わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

CGIのオフラインモードを回避するには

Rubyで(Railsではなく),ちょっとしたCGIスクリプトのはずが,いろいろトラブルが起こって,Test::Unitを使ってテストしていくことにしました.
なのですが,さて,CGIの入力を与えるのはどうすればいいのか…
何も考えずにテストすると,CGI.newのたびに「(offline mode: enter name=value pairs on standard input)」が出て入力待ちになります.オフラインモードってやつですね.
cgi.rbを読みますかね.ファイルを開き,「offline」で検索すると,こんなコードを見つけました.

    # offline mode. read name=value pairs on standard input.
    def read_from_cmdline
      require "shellwords"

      string = unless ARGV.empty?
        ARGV.join(' ')
      else
        if STDIN.tty?
          STDERR.print(
            %|(offline mode: enter name=value pairs on standard input)\n|
          )
        end
        readlines.join(' ').gsub(/\n/n, '')
      end.gsub(/\\=/n, '%3D').gsub(/\\&/n, '%26')
    (以下略)

なんだ,あらかじめARGVに値を入れておけばいいのか!
それではと,CGI.newの前に

ARGV = ["abc=001&def=002"]

を書いて動かすと,「dynamic constant assignment」というエラーが出ます.ARGVは,組み込み定数ですね.
ちょっと考えて,

ARGV.replace(["abc=001&def=002"])

ならどうか…うまくいきました.
「&」を使わず,

ARGV.replace(%w(abc=001 def=002))

というのでもOKでした*1

*1:「%w」は%記法の一つです.あっと,中でURLエンコードをするとなったら,「%w」より「%W」のほうがよさそうだ….