2011-12-05 9 views
42

que tienen una prueba de este modo:de prueba contenidos de hash utilizando RSpec

it "should not indicate backwards jumps if the checker position is not a king" do 
    board = Board.new 
    game_board = board.create_test_board 
    board.add_checker(game_board, :red, 3, 3) 
    x_coord = 3 
    y_coord = 3 
    jump_locations = {} 
    jump_locations["upper_left"] = true 
    jump_locations["upper_right"] = false 
    jump_locations["lower_left"] = false 
    jump_locations["lower_right"] = true 
    adjusted_jump_locations = @bs.adjust_jump_locations_if_not_king(game_board, x_coord, y_coord, jump_locations) 
    adjusted_jump_locations["upper_left"].should == true 
    adjusted_jump_locations["upper_right"].should == false 
    adjusted_jump_locations["lower_left"].should == false 
    adjusted_jump_locations["lower_right"].should == false 
    end 

cual, lo sé, es prolijo. ¿Hay una manera más concisa de expresar mis expectativas? Miré los documentos pero no puedo ver dónde comprimir mis expectativas. Gracias.

Respuesta

78

http://rubydoc.info/gems/rspec-expectations/RSpec/Matchers:include

Funciona para hashes también:

jump_locations.should include(
    "upper_left" => true, 
    "upper_right" => false, 
    "lower_left" => false, 
    "lower_right" => true 
) 
+11

Gracias, David. Por cierto ventilador enorme. Realmente disfruté el libro RSpec. –

+0

Ojalá hubiera un método correspondiente como match_array –

+0

¡Lo mismo en el Fanage David! ¡Su "Libro de Rspec" está bien visto! –

18

Sólo quiero añadir a @ La respuesta de David. Puede anidar y usar emparejamientos en su hash include. Por ejemplo:

# Pass 
expect({ 
    "num" => 5, 
    "a" => { 
    "b" => [3, 4, 5] 
    } 
}).to include({ 
    "num" => a_value_between(3, 10), 
    "a" => { 
    "b" => be_an(Array) 
    } 
}) 

Una advertencia: a anidada include de hash debe probar todas las claves o la prueba fallará, por ejemplo:

# Fail 
expect({ 
    "a" => { 
    "b" => 1, 
    "c" => 2 
    } 
}).to include({ 
    "a" => { 
    "b" => 1 
    } 
}) 
+4

Puede resolver su advertencia mediante el uso anidado incluye: '' 'esperar ({ "a"=> { "b"=> 1, "c"=> 2 } }) para incluir (. { "a" => include ({ "b" => 1 }) '' ' – AngelCabo

+0

la mayoría de los mezcladores tienen alias" verbo "y más" sustantivo ", este último podría leer mejor al anidar:' expect ({"a" => {"b" => 1, "c" => 2}}). para incluir ({"a" => a_hash_including ({"b" => 1})}) '. http://timjwade.com/2016/08/01/testing-json-apis-with-rspec-composable-matchers.html es una buena publicación de blog sobre esto. –

2

Sintaxis ha cambiado para RSpec 3, pero incluyen matcher es todavía el uno:

expect(jump_locations).to include(
    "upper_left" => true, 
    "upper_right" => false, 
    "lower_left" => false, 
    "lower_right" => true 
) 

Ver built-in-matchers#include-matcher.

0

Otra manera fácil de probar si todo el contenido es un Hash es a la salida si el contenido es el mismo objeto hash:

it 'is to be a Hash Object' do 
    workbook = {name: 'A', address: 'La'} 
    expect(workbook.is_a?(Hash)).to be_truthy 
end