2011-12-05 15 views
42

Tôi có một bài kiểm tra như sau:Testing băm nội dung sử dụng 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 

đó, tôi biết, là tiết. Có cách nào ngắn gọn hơn để nêu ra kỳ vọng của tôi không. Tôi đã xem xét các tài liệu nhưng tôi không thể nhìn thấy nơi để nén mong đợi của tôi. Cảm ơn.

Trả lời

78

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

Nó hoạt động cho băm quá:

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

Cảm ơn, David. Quạt lớn BTW. Thực sự rất thích cuốn sách RSpec. –

+0

Tôi ước có một phương pháp tương ứng như match_array –

+0

Ditto trên Fanage David! "Cuốn sách Rspec" của bạn là tốt! –

18

Chỉ muốn thêm vào @ câu trả lời của David. Bạn có thể lồng và sử dụng đối sánh trong mã băm include của mình. Ví dụ:

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

Một caveat: một lồng nhau include băm phải kiểm tra tất cả các phím hoặc các thử nghiệm sẽ thất bại, ví dụ:

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

Bạn có thể giải quyết caveat bằng cách dùng các lồng bao gồm: '' 'mong đợi ({ "a"=> { "b"=> 1, "c"=> 2 } }) để bao gồm (. { "a" => bao gồm ({ "b" => 1 }) }) '' ' – AngelCabo

+0

hầu hết các đối sánh có cả" danh từ "và" danh từ "bí danh, sau này có thể đọc tốt hơn khi lồng:' mong đợi ({"a" => {"b" => 1, "c" => 2}}) để bao gồm ({"a" => a_hash_including ({"b" => 1})}) '. http://timjwade.com/2016/08/01/testing-json-apis-with-rspec-composable-matchers.html là một bài đăng trên blog tốt về điều này. –

2

Cú pháp đã thay đổi cho RSpec 3, nhưng bao gồm khớp vẫn là số điện thoại:

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

Xem built-in-matchers#include-matcher.

0

Một cách dễ dàng khác để kiểm tra xem toàn bộ nội dung là một Hash là để kiểm tra nếu nội dung là Hash Object bản thân:

it 'is to be a Hash Object' do 
    workbook = {name: 'A', address: 'La'} 
    expect(workbook.is_a?(Hash)).to be_truthy 
end 
Các vấn đề liên quan