45

RSpecの場合:xUnitスタイルのテストフレームワークで行うのと同じ方法で、チェックにメッセージを添付できますか?どのように?

assert_equal value1, value2, 'something is wrong'
4

3 に答える 3

61

RSpec 3+の場合:

メッセージは、文字列として、またはprocを使用してカスタマイズできます(参照を確認してください)。

expect(1).to eq(2), 'one is not two!'

カスタマイズされたメッセージRSpecは有用な失敗メッセージを提供しようとしますが、より具体的な情報が必要な場合は、例で独自のメッセージを定義できます。これは、オペレーターマッチャー以外のマッチャーで機能します。

ソース@relishapp


古いRSpecバージョンの場合

shouldマッチャーのデフォルトメッセージをオーバーライドshould_notする2番目の引数()を取ります。message

1.should be(2), 'one is not two!'

ただし、デフォルトのメッセージは通常非常に便利です。

于 2010-11-15T11:40:38.290 に答える
28

RSpecでは、適切な失敗メッセージを出力するのがマッチャーの仕事です。RSpecに同梱されている汎用マッチャーは、特定のドメインについて何も知らないため、明らかに一般的な非記述の失敗メッセージしか出力できません。そのため、独自のドメイン固有のマッチャーを作成することをお勧めします。これにより、より読みやすいテストと読みやすい失敗メッセージの両方が得られます。

RSpecドキュメントの例を次に示します。

require 'rspec/expectations'

RSpec::Matchers.define :be_a_multiple_of do |expected|
  match do |actual|
    (actual % expected).zero?
  end
  failure_message_for_should do |actual|
    "expected that #{actual} would be a multiple of #{expected}"
  end
  failure_message_for_should_not do |actual|
    "expected that #{actual} would not be a multiple of #{expected}"
  end
  description do
    "be multiple of #{expected}"
  end
end

注:match必須のみで、その他は自動的に生成されます。ただし、質問の要点はもちろん、デフォルトのメッセージが気に入らないということです。そのため、少なくともも定義する必要がありますfailure_message_for_should

また、正の場合と負の場合で異なるロジックが必要かどうかをmatch_for_should定義するmatch_for_should_notこともできます。match

@Chris Johnsenが示すように、期待値に明示的にメッセージを渡すこともできます。ただし、読みやすさの利点を失うリスクがあります。

これを比較してください:

user.permissions.should be(42), 'user does not have administrative rights'

これとともに:

user.should have_administrative_rights

これは(大まかに)次のように実装されます。

require 'rspec/expectations'

RSpec::Matchers.define :have_administrative_rights do
  match do |thing|
    thing.permissions == 42
  end
  failure_message_for_should do |actual|
    'user does not have administrative rights'
  end
  failure_message_for_should_not do |actual|
    'user has administrative rights'
  end
end
于 2010-11-15T11:21:17.990 に答える
6

私の場合、それは括弧の問題でした:

        expect(coder.is_partial?(v)).to eq p, "expected #{v} for #{p}"

これにより、引数の数が間違っていましたが、正しい方法は次のとおりです。

        expect(coder.is_partial?(v)).to eq(p), "expected #{v} for #{p}"
于 2015-07-03T14:31:00.350 に答える