46 votes

Comment fixer message à rspec vérifier?

Dans rspec: puis-je joindre un message à un chèque de la même façon que je le ferais dans xUnit style de frameworks de test? Comment?

assert_equal value1, value2, "something is wrong"

62voto

Chris Johnsen Points 50064

should et should_not prendre un deuxième argument (message) qui l'emporte sur le comparateur de message par défaut.

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

Par défaut les messages sont généralement assez utile.

29voto

Jörg W Mittag Points 153275

Dans RSpec, c'est le comparateur de travail pour l'impression d'un bon message d'échec. Le générique de rapprochement fournis avec RSpec peut évidemment d'impression générique non-descript messages d'échec, car ils ne savent rien au sujet de votre domaine particulier. C'est pourquoi il est recommandé que vous écrivez votre propre nom de domaine spécifique de rapprochement, qui vous donnera à la fois plus lisible de tests et plus lisible des messages de panne.

Voici un exemple de la RSpec de la documentation:

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

Remarque: seuls les match est requis, les autres seront générés automatiquement. Cependant, le point de l'ensemble de votre question est bien sûr que vous n'avez pas comme les messages par défaut, donc vous devez au moins aussi définir failure_message_for_should.

Vous pouvez également définir match_for_should et match_for_should_not au lieu de match si vous avez besoin d'une logique différente dans le cas positives et négatives.

Comme @Chris Brown montre, vous pouvez également explicitement passer un message à l'attente. Cependant, vous courez le risque de perdre la lisibilité des avantages.

Comparer ceci:

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

avec ceci:

user.should have_administrative_rights

Que serait (à peu près) soit mis en place comme ceci:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X