Rspec тестирует метод с помощью перечислителя в Ruby. Метод запускается только после сбоя впоследствии

В настоящее время я завершаю решение судоку на рубине. Используя перечислитель, я создал метод, который создает 9 массивов на основе моей сетки 9x9, каждый из которых ссылается на поле 3x3 в игре судоку. Тестируя это в Rspec, я обнаружил, что это работает только в одном тесте. Когда я создаю второй тест, используя тот же метод, он всегда будет терпеть неудачу. Когда я путаюсь в тестах, они работают индивидуально, но не тогда, когда метод вызывается во втором тесте. В идеале я хочу добавить свой метод в мой метод инициализации, но это не проходит все тесты, кроме одного. Я получаю сообщение об ошибке «StopIteration: итерация достигла конца». ЧТО я понимаю, но почему он не может просто перезапускаться при каждом тесте? Есть идеи?

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

person James Carter    schedule 29.01.2015    source источник
comment
.each предназначен для использования перечислителя.   -  person James Carter    schedule 29.01.2015


Ответы (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
person spickermann    schedule 29.01.2015