Rspec тестирует метод с использованием перечислителя в Ruby. Метод запускается только после сбоя
В настоящее время я заканчиваю решатель судоку в рубине. Используя перечислитель, я создал метод, который создает 9 массивов на основе моей сетки 9x9, каждый из которых относится к блоку 3x3 в игре судоку. Тестируя это в Rspec, я обнаружил, что он работает только в одном тесте. Когда я создаю второй тест, используя тот же метод, он всегда будет неудачным. Когда я разбираюсь с тестами, они работают индивидуально, но не тогда, когда метод вызывается во втором тесте. В идеале я хочу добавить свой метод в мой метод инициализации, но он не проходит все тесты, кроме одного. Я получаю сообщение об ошибке: "СтопИтерация: итерация достигла конца". Что я понимаю, но почему нельзя просто перезапустить при каждом тесте? Есть идеи?
class Grid
BoxOfIndex = [
0,0,0,1,1,1,2,2,2,0,0,0,1,1,1,2,2,2,0,0,0,1,1,1,2,2,2,
3,3,3,4,4,4,5,5,5,3,3,3,4,4,4,5,5,5,3,3,3,4,4,4,5,5,5,
6,6,6,7,7,7,8,8,8,6,6,6,7,7,7,8,8,8,6,6,6,7,7,7,8,8,8
].each
attr_accessor :cells, :rows, :columns, :boxes
def initialize(puzzle)
@cells = puzzle.split('').map {|v| Cell.new(v) }
create_boxes
end
def create_rows
@rows = cells.each_slice(9).to_a
end
def create_columns
@columns = create_rows.transpose
end
def create_boxes
@boxes = []
9.times { @boxes << Array.new}
@cells.each{|cell| @boxes[BoxOfIndex.next].concat([cell])}
end
....................Tests below(second test fails)
it "should be able to create boxes with a cell value" do
grid.create_boxes
expect(grid.boxes[0][2].value).to eq(5)
end
it "should be able to find neighbours of a cell" do
grid.create_boxes
end
1 ответ
Я думаю, что проблема в том, что ваш BoxOfIndex
константа содержит итератор. В вашем create_boxes
метод, который вы повторяете до последнего элемента. Более поздние спецификации не могут позвонить next
опять же, потому что вы уже достигли конца.
Измените константу, чтобы просто держать массив:
BOX_OF_INDEX = [
0,0,0,1,1,1,2,2,2,0,0,0,1,1,1,2,2,2,0,0,0,1,1,1,2,2,2,
3,3,3,4,4,4,5,5,5,3,3,3,4,4,4,5,5,5,3,3,3,4,4,4,5,5,5,
6,6,6,7,7,7,8,8,8,6,6,6,7,7,7,8,8,8,6,6,6,7,7,7,8,8,8
]
И изменить create_boxes
способ использовать новый итератор каждый раз:
def create_boxes
@boxes = []
iterator = BOX_OF_INDEX.each
9.times { @boxes << Array.new }
@cells.each { |cell| @boxes[iterator.next].concat([cell]) }
end