2

デフォルトのRailsロガーではないログに、条件に基づいて複数のメッセージを記録する方法をテストしようとしています。ロガーをフォーマットしましたconfig/environment.rb

# Format the logger
class Logger
  def format_message(level, time, progname, msg)
    "#{time.to_s(:db)} #{level} -- #{msg}\n"
  end
end

ディレクトリの ImportRecording クラスに新しいロガーを作成しましたlib/。そのクラスのメソッドには、次のものが含まれます。

# some code omitted...
days.each do |day|
  if not hash[day].include? "copied"
    @log.error "#{day} needs to be copied!"
  end
  if not hash[day].include? "compressed"
    @log.error "#{day} needs to be compressed!"
  end
  if not hash[day].include? "imported"
    @log.debug "#{day} needs to be imported"
    `rake RAILS_ENV=#{Rails.env} recordings:import[#{day}]` unless Rails.env == "test"
  end
end
# finishing up logging omitted...

このメソッドのテストに役立つ小さなマクロを作成しました。

def stub_todo
  { "20130220" => ["copied"],
    "20130219" => ["copied", "compressed"],
    "20130218" => ["copied", "compressed", "imported"] }
end

ここに私のテストがあります:

describe ".execute_todo" do
  it "carries out the appropriate commands, based on the todo hash" do
    ImportRecording.execute_todo stub_todo
    ImportRecording.log.should_receive(:debug).with("20130219 needs to be imported")
    ImportRecording.log.should_receive(:error).with("20130220 needs to be compressed!")
    ImportRecording.log.should_receive(:debug).with("20130220 needs to be imported")
  end
end

これらのテストを実行し、行が追加されるのを監視しながらインポート ログを見つめます (ログが大きいため、遅延があります) が、テストはまだ失敗します。ログのフォーマットがこれを台無しにしているのだろうかと思いますが、前述の文字列をメソッドとログ渡しています。何か助けはありますか?:debug:error

2013 年 3 月 14 日編集:

誰かがここで私を助けてくれることを期待して、テストによって次のように変更しました。

it "carries out the appropriate commands, based on the todo hash" do
  ImportRecording.stub!(:execute_todo).with(stub_todo).and_return(false)
  ImportRecording.log.should_receive(:debug).with("20130219 needs to be imported")
  ImportRecording.log.should_receive(:error).with("20130220 needs to be compressed!")
  ImportRecording.log.should_receive(:debug).with("20130220 needs to be imported")
end

そして、これは私がRSpecから得ているエラーです:

Failure/Error: ImportRecording.log.should_receive(:debug).with("20130219 needs to be imported")
  (#<Logger:0x007fb04fa83ed0>).debug("20130219 needs to be imported")
    expected: 1 time
    received: 0 times
4

2 に答える 2

3

問題が見つかりました。どういうわけか、これらの期待は、実際にそれらを引き起こすメソッドのに宣言されることになっています。コードは次のようになります。

it "carries out the appropriate commands, based on the todo hash" do
  ImportRecording.log.should_receive(:debug).with("20130219 needs to be imported")
  ImportRecording.log.should_receive(:error).with("20130220 needs to be compressed!")
  ImportRecording.log.should_receive(:debug).with("20130220 needs to be imported")
  ImportRecording.execute_todo stub_todo
end

テストに合格するようになりました。また、メソッド呼び出しのためにログに書き込まれたすべての行を説明するために、テストにさらに行を追加する必要がありました。したがって、将来の研究者のために、期待を述べてからメソッド呼び出してください。

于 2013-03-26T23:54:36.617 に答える
0

これらのテストを実行し、行が追加されるのを確認しながら、インポート ログを見つめます。

ロガー呼び出しにメッセージの期待値を設定すると、ログに追加された行が表示されないはずです。スタブと同様に、メッセージの期待値は元のメソッドの実装を置き換えます。これは、ロガーのセットアップが何らかの形で誤って構成されていることを示唆しています。

于 2013-03-11T15:30:58.723 に答える