En rspec: ¿Puedo adjuntar un mensaje a una verificación de la misma manera que lo haría en marcos de prueba de estilo xUnit? ¿Cómo?¿Cómo adjuntar un mensaje a la comprobación de rspec?
assert_equal value1, value2, "something is wrong"
En rspec: ¿Puedo adjuntar un mensaje a una verificación de la misma manera que lo haría en marcos de prueba de estilo xUnit? ¿Cómo?¿Cómo adjuntar un mensaje a la comprobación de rspec?
assert_equal value1, value2, "something is wrong"
should
y should_not
echar un segundo argumento (message
) que anula el valor por defecto del emparejador mensaje.
1.should be(2), 'one is not two!'
Sin embargo, los mensajes predeterminados suelen ser bastante útiles.
actualización:
para RSpec 3:
expect(1).to eq(2), "one is not two!"
En RSpec, el trabajo del emparejador es imprimir un mensaje de error razonable. Los marcadores genéricos que se envían con RSpec, obviamente, solo pueden imprimir mensajes de falla genéricos no descriptivos, ya que no saben nada sobre su dominio en particular. Es por eso que se recomienda que escriba sus propios marcadores de dominio específicos, lo que le proporcionará pruebas más legibles y mensajes de error más legibles.
He aquí un ejemplo de la RSpec 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
Nota: sólo es necesario match
, los otros serán generados automáticamente. Sin embargo, el objetivo de su pregunta es, por supuesto, que haga , no, como los mensajes predeterminados, por lo que al menos también debe definir failure_message_for_should
.
Además, puede definir match_for_should
y match_for_should_not
en lugar de match
si necesita una 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, 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 sería (más o menos) se implementa de la siguiente:
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
Gracias, no sabía que la forma estándar de definir los emparejadores es así de fácil. Aunque prefiero ser "flojo": factorizar tales cosas en entidades con nombres separados cuando aparecen al menos dos veces o simplifican notablemente el contexto donde se usan. – Alexey
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 la forma correcta es:
expect(coder.is_partial?(v)).to eq(p), "expected #{v} for #{p}"
¡Muchas gracias! ¡Funciona! –
¿Cómo se puede hacer con '#should =='? –
@mohawkjohn: Parece que sería algo así como '1.should (nil, 'uno no es dos!') == 2' (ick), pero eso funciona porque el operador '==' parece que siempre genera su propio mensaje. –