2011-10-27 33 views
23

¿Cuál sería la mejor manera de escribir el rspec en una situación donde cualquiera de los dos (o más) resultados son aceptables?Rspec: Debería ser (esto o lo otro)

Aquí hay un ejemplo de lo que quiero hacer. Esto es obviamente erróneo (creo), pero debe darle la esencia de lo que estoy tratando de lograr:

it "should be heads or tails" do 
    h="heads" 
    t="tails" 
    flip_coin.should be(h || t) 
end 

Y sí, soy consciente de que podría escribir mi propia matcher rspec "should_be_one_or_the_other (option1 , opción2) ", pero eso parece demasiado, esperaba una solución mejor.

Respuesta

24

ActiveSupport ofrece Object#in? método. Se puede combinar con RSpec y simplemente utilizar el siguiente:

flip_coin.should be_in(["heads", "tails"]) 

O con el nuevo Rspec 3 sintaxis:

expect(flip_coin).to be_in(["heads", "tails"]) 
+0

Esto no funcionó para mí en la última versión, tuve que convertirlo en una matriz primero 'be_in ([" cabezas "," colas "])' – Vox

+0

Gracias por la retroalimentación –

+1

Corrección menor: ActiveSupport define '#in?' en 'Object', no en' Array', ya que se llama así 'flip_coin.in? % w (caras cruzadas) 'y flip_coin pueden ser cualquier' Objeto'. –

14

probablemente me escribo algo como esto:

it "should be heads or tails" do 
    ["heads", "tails"].should include flip_coin 
end 
+5

Una opción decente, pero parece que subvierte los "rspec" adecuados manera de hacer las cosas, con el valor esperado de la derecho. – GlyphGryph

+1

Sí camino equivocado, pero sin duda la sintaxis más limpia – idrinkpabst

11

Otra forma de escribirlo con la expectativa a la derecha de la que:

it 'should be heads or tails' do 
    flip_coin.should satisfy{|s| ['heads', 'tails'].include?(s)} 
end 
15

Sé que esto es antiguo pero en me encontré con esto en RSpec 3.4, hay un or keyword ahora. Así que esto es válido:

expect(flip_coin).to eq('heads').or(eq('tails')) 
1

si se aplican or con be matcher

expect(flip_coin).to eq('heads').or(be == 'tails') 
+0

Encuentro esto menos intuitivo que la respuesta usando "o" desde diciembre '15. –

Cuestiones relacionadas