Тестирование хеш-содержимого с использованием 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 

который, я знаю, многословен. Есть ли более краткий способ изложить мои ожидания? Я просмотрел документы, но не вижу, где можно сжать мои ожидания. Спасибо.


person steve_gallagher    schedule 05.12.2011    source источник


Ответы (4)


Это работает и для хэшей:

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

Источник: include matcher @ relishapp.com

person David Chelimsky    schedule 05.12.2011
comment
Спасибо, Дэвид. КСТАТИ Огромный фанат. Мне очень понравилась книга RSpec. - person steve_gallagher; 06.12.2011
comment
Я бы хотел, чтобы был соответствующий метод, такой как match_array - person max pleaner; 10.07.2017
comment
То же самое на Fanage Дэвид! Ваша книга The Rspec хорошо изучена! - person Dave Collins; 02.08.2017

Просто хочу добавить к ответу @David. Вы можете вкладывать и использовать сопоставители в своем хэше include. Например:

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

Предостережение: вложенный хэш include должен проверять все ключи, иначе тест не пройден, например:

# Fail
expect({
  "a" => { 
    "b" => 1,
    "c" => 2
  }
}).to include({
  "a" => {
    "b" => 1
  }
})
person Benjamin Cheah    schedule 25.03.2015
comment
Вы можете решить свою оговорку, используя вложенные включения: expect({ "a" => { "b" => 1, "c" => 2 } }).to include({ "a" => include({ "b" => 1 }) }) - person AngelCabo; 16.09.2016
comment
большинство сопоставителей имеют как глагольные, так и более длинные псевдонимы существительных, последние могут лучше читаться при вложении: expect({ "a" => { "b" => 1, "c" => 2 } }).to include({ "a" => a_hash_including({ "b" => 1 }) }). timjwade.com/2016/08/ 01/ — хороший пост на эту тему. - person Beni Cherniavsky-Paskin; 13.07.2017

Синтаксис для RSpec 3 изменился, но включенный сопоставитель остался прежним:

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

См. встроенный- matchers#include-matcher.

person Marko Avlijaš    schedule 25.03.2017

Еще один простой способ проверить, является ли весь контент хэшем, — проверить, является ли контент самим хэш-объектом:

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

Для вопроса выше мы можем проверить следующее:

expect(adjusted_jump_locations).to match(hash_including('upper_left' => true))
person Kiry Meas    schedule 29.06.2017
comment
Вопрос заключается в проверке содержимого хэша, а не в том, является ли ответ хешем. - person ToTenMilan; 24.04.2020
comment
@ToTenMilan, вот почему я подчеркиваю, что есть еще один способ ... это может / не может помочь. Это зависит. - person Kiry Meas; 27.04.2020