2010-11-15 11 views

Respuesta

52

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!" 
+0

¡Muchas gracias! ¡Funciona! –

+4

¿Cómo se puede hacer con '#should =='? –

+1

@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. –

27

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 
+1

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

4

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}" 
+0

gracias por agregar la respuesta para RSpec 3 :) – Alexey

+0

Finaly Encontré esta solución. Muchas gracias. – Foton

+0

Sí, eso fue todo para mí. Usando '.to be (true)'. – djangofan

Cuestiones relacionadas