ruby - rails - rspec subject
¿Cómo adjuntar un mensaje a la comprobación de rspec? (3)
En RSpec, el trabajo del emparejador es imprimir un mensaje de falla sensible. 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.
Aquí hay 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: solo se requiere match
, los demás se generarán automáticamente. Sin embargo, el objetivo de su pregunta es, por supuesto, que no le gustan los mensajes predeterminados, por lo que debe definir al menos failure_message_for_should
.
Además, puede definir match_for_should
y match_for_should_not
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, corre el riesgo de perder las ventajas de legibilidad.
Compare esto:
user.permissions.should be(42), ''user does not have administrative rights''
con este:
user.should have_administrative_rights
Eso (más o menos) se implementaría así:
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 rspec: ¿Puedo adjuntar un mensaje a un cheque de la misma forma que lo haría en marcos de prueba de estilo xUnit? ¿Cómo?
assert_equal value1, value2, "something is wrong"
En mi caso, fue un problema de paréntesis:
expect(coder.is_partial?(v)).to eq p, "expected #{v} for #{p}"
esto dio como resultado un número incorrecto de argumentos, mientras que la forma correcta es:
expect(coder.is_partial?(v)).to eq(p), "expected #{v} for #{p}"
should
y should_not
take a second argument ( message
) que anula el mensaje predeterminado del matcher.
1.should be(2), ''one is not two!''
Sin embargo, los mensajes predeterminados suelen ser bastante útiles.
actualizar:
para RSpec 3:
expect(1).to eq(2), "one is not two!"