Cómo adjuntar un mensaje a un cheque rspec?
Pregunta
En rspec: ¿Puedo adjuntar un mensaje a una verificación de la misma forma que lo haría en los marcos de las pruebas de estilo xUnit? ¿Cómo?
assert_equal value1, value2, "something is wrong"
Solución
should
y should_not
tomar un segundo argumento (message
) que anula el mensaje predeterminado del emparejador.
1.should be(2), 'one is not two!'
Los mensajes predeterminados son aunque suele ser bastante útil.
actualización:
para RSpec 3:
expect(1).to eq(2), "one is not two!"
Otros consejos
En RSpec, es el trabajo de la matcher para imprimir un mensaje de fallo sensible. Los comparadores genéricos que se suministran con RSpec, obviamente, sólo puede imprimir mensajes de error no descripta genéricos, ya que no sabe nada acerca de su dominio particular. Es por eso que se recomienda que usted escribe sus propios comparadores específicos de dominio, lo que le dará dos pruebas más legibles y mensajes de error más legible.
Este es un ejemplo de la documentación de 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
Nota: sólo se requiere match
, los demás se generará automáticamente. Sin embargo, el punto central de su pregunta es, por supuesto, que lo hace no como los mensajes por defecto, por lo que necesita al menos también definir failure_message_for_should
.
Además, puede definir match_for_should
y match_for_should_not
en lugar de match
si necesita lógica diferente en el caso positivo y negativo.
Como muestra @ Chris Johnsen, también puede pasar explícitamente un mensaje a la expectativa. Sin embargo, se corre el riesgo de perder las ventajas de legibilidad.
Compare esto:
user.permissions.should be(42), 'user does not have administrative rights'
con esto:
user.should have_administrative_rights
Eso (más o menos) implementarse como esto:
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
En mi caso se trataba de un problema de los paréntesis:
expect(coder.is_partial?(v)).to eq p, "expected #{v} for #{p}"
Esto resultó en un número incorrecto de argumentos, mientras que la forma correcta es:
expect(coder.is_partial?(v)).to eq(p), "expected #{v} for #{p}"