2011-12-05 25 views
42

mam test tak:Testowanie zawartość hash używając 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 

co wiem, jest gadatliwy. Czy istnieje bardziej zwięzły sposób na wyrażenie moich oczekiwań. Przyjrzałem się dokumentom, ale nie widzę gdzie skompresować moje oczekiwania. Dzięki.

Odpowiedz

78

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

Działa na zbyt skrótów:

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

Dzięki, David. BTW Ogromny fan. Naprawdę podobała mi się książka RSpec. –

+0

Szkoda, że ​​nie było odpowiedniej metody, takiej jak match_array –

+0

Ditto na Fanage David! Twoja "Książka Rspec" jest dobrze napisana! –

18

Chcę tylko dodać do @ odpowiedź Dawida. Można zagnieździć się i używać dopasowań w haszu include. Na przykład:

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

zastrzeżenie: zagnieżdżony include hash musi przetestować wszystkie klucze lub test nie powiedzie się, na przykład:

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

można rozwiązać zastrzeżenie korzystać zarówno zagnieżdżone zawiera '' oczekiwać ({ "a" => { "B" => 1 "c" => 2 } }) obejmuje (. { "a" => include ({ "b" => 1 }) }) '' ' – AngelCabo

+0

większość matchers ma oba" czasownik "i dłuższe" rzeczownikowe "aliasy, te ostatnie mogą lepiej czytać podczas zagnieżdżania:' oczekiwać ({"a" => {"b" => 1, "c" => 2}})., aby dołączyć ({"a" => a_hash_including ({"b" => 1})}) '. http://timjwade.com/2016/08/01/testing-json-apis-with-rspec-composable-matchers.html to dobry wpis na blogu na ten temat. –

2

Składnia zmieniła się RSpec 3, ale to matcher jest nadal jedno:

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

Zobacz built-in-matchers#include-matcher.

0

Innym łatwy sposób sprawdzić, czy cała treść jest Hash jest do kasy, jeśli treść jest przedmiotem Hash sama:

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